2017-07-27 64 views
1

讓我們assum,我們有這個功能:具體的IEnumerable <T>具體的IEnumerable <string>

List<string> ToCollectionString<T>(List<T> collectinon); 

,現在我們如何改變List返回特定IEnumerable一樣給定的參數?我們得到List那麼回事List,我們得到Stack那麼回事Stack

如果我們有:

List<T> ToCollectionString<T>(List<T>); 

這將是

K ToCollectionString<K,T>(K collection) where K:IEnumerable<T> 

但是,我們能做些什麼,如果我們有這樣的List<string>

+2

「我們能做些什麼,如果我們有這樣的'名單'?」你能澄清你的花束這個問題?我不知道你的意思。 –

+0

所以你試圖支持其他IEnumerable類型只是'列表'? – ryanyuyu

+4

我想你是說你想聲明一個方法,當通過'K '時返回'K ' - 不幸的是,這不能用C#泛型來完成。 – Blorgbeard

回答

1

假設您試圖創建傳入但擁有字符串的相同集合類型的實例。

一般來說,這是不可能的,因爲傳入的類型可能沒有辦法根據您擁有的信息構造類型的新實例(顯而易見的情況 - list.Select(...)的結果作爲參數傳遞 - 實現它的類型實際上沒有可見的構造函數)。

在極少數情況下,如果您可以構造類型,則必須使用反射來查找確切類型的參數Using C# reflection to call a constructor。如果你需要空集合 - 你就完成了這一點。

如果您需要將項目添加到結果集合(即,您想在每個源項目上調用「ToString」),如果需要使用IEnumerable作爲參數找到克隆構造函數,否則您必須填充結果集合(可能用反射 - How to use reflection to add a new item to a collection)。如果您可以將傳入的類型限制爲支持具有「添加項目」功能的界面(即IList),則至少可以強制輸入第二部分。


注意:它可能是更容易,更有效,只是返回IEnumerable<string>(即return collection.Select(x=>x.ToString()),讓來電者樹立正確的類型 - 這樣你避免所有的反射的複雜性,讓來電者,而不是使用鑄造結果強類型的值它也將避免情況下,當類型不能被解釋爲調用者負責它:

var stronglyTyped = new Stack(ToCollectionString(collectinon)); 
相關問題