2010-07-03 121 views
0

有沒有解決這個投射例子的問題的解決方案?我需要爲集合添加一個新元素,所以我必須解決它。ICollection投射問題

IEnumerable enumerable; 
    IEnumerable enumerable2; 
    enumerable = new ObservableCollection<Something>(); 
    enumerable2 = new ObservableCollection<Object>(); 


    ICollection<Object> try = (ICollection<Object>)enumerable;  //Don’t work 
    ICollection<Object> try2 = (ICollection<Object>)enumerable2; //Work 
+1

如果您使用不同的泛型類型,那麼它們是不同的類型。即使V擴展/實現X – IanNorton 2010-07-03 08:49:18

+0

ok,也不能將T 轉換爲T 。所以沒有任何解決方案:( – Wumpus 2010-07-03 08:58:27

+0

總有解決方案! – DanDan 2010-07-03 10:58:55

回答

0

我不是100%肯定這是你的意思,但你有沒有試過這樣:

IEnumerable<Object> try3 = enumerable.Cast<Object>(); 

好吧,沒有工作,怎麼樣動態類型:

dynamic var = new Something(); 
dynamic try1 = enumerable;  
try1.Add(var); 
+0

我試過了,但它不起作用。用這種方法我想我得到一個新的集合,所以我不能添加一個新的元素到原始(可枚舉)的集合。 – Wumpus 2010-07-03 11:14:23

+0

編輯動態打字,這是否有訣竅? – Kaneti 2010-07-03 13:09:46

+0

很高興聽到它的工作。 祝你好運! – Kaneti 2010-07-07 20:14:04

2

退房協方差和逆變C#中的4通用參數,當面對這樣的問題,這可能會爲您提供更多信息以供將來。

0

如果你所知道的是object,那麼非通用接口是您的朋友:

IList list = (IList)foo; 
list.Add(yourItem); 

但是!並非所有可列舉的項目都是列表,因此並非所有可以用這種方式添加。 IList支撐了很多數據綁定,所以是一個很好的選擇。

0

「try」是C#中的保留字。你有沒有嘗試過另一個變量名?或者如果您需要使用「try」變量名稱,則可以使用@try。

+0

對不起,這只是一個快速示例:) – Wumpus 2010-07-03 11:08:48

0

您可以迭代something集合並將元素插入到對象中。

0

使用與ToList組合的Cast擴展。

IEnumerable ie1 = new ObservableCollection<string>(); 
ICollection<object> ic1 = (ICollection<object>)ie1.Cast<object>().ToList(); 

或者手動迭代。

0

如果您可以控制相關代碼,那麼也許是時候重新考慮一下設計了。人們經常嘗試使用可能達到預期結果的最受限制的界面。在這種情況下,如果您想要做的事情之一是添加新項目,那麼IEnumerable無法實現該結果。更改爲更合適的類型可能是比投集集合更好的解決方案。

0

動態打字工作(只有一件壞事,我必須鏈接windows.csharp和system.core dll,這是〜1MB,所以它不是最好的Silverlight應用程序,但這是最好的解決方案,我現在知道。)