2010-07-03 52 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应用程序,但这是最好的解决方案,我现在知道。)