有没有解决这个演员示例问题的解决方案?我需要在集合中添加一个新元素,所以我必须解决它。
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
答案 0 :(得分:2)
查看C#4中通用参数的协方差和逆变。它可能会为您提供有关未来遇到此类问题的更多信息。
答案 1 :(得分:0)
如果您只知道object
,那么非通用接口就是您的朋友:
IList list = (IList)foo;
list.Add(yourItem);
然而!并非所有可枚举项都是列表,因此并非所有项都可以这种方式添加。 IList
支持很多数据绑定,所以这是一个不错的选择。
答案 2 :(得分:0)
“try”是C#中的保留字。你试过另一个变量名吗?或者,如果需要使用“try”变量名,可以使用@try。
答案 3 :(得分:0)
我不确定100%这是你的意思,但你试过这个:
IEnumerable<Object> try3 = enumerable.Cast<Object>();
好吧,它不起作用,如何动态输入:
dynamic var = new Something();
dynamic try1 = enumerable;
try1.Add(var);
答案 4 :(得分:0)
您可以遍历某个集合并将元素插入到对象中。
答案 5 :(得分:0)
使用Cast扩展名结合ToList。
IEnumerable ie1 = new ObservableCollection<string>();
ICollection<object> ic1 = (ICollection<object>)ie1.Cast<object>().ToList();
或手动迭代。
答案 6 :(得分:0)
如果您可以控制相关代码,也许是时候重新考虑一下这个设计了。人们经常尝试使用可能仍然可以达到预期效果的最受限制的界面。在这种情况下,似乎 IEnumerable 无法实现该结果,如果您要做的事情之一是添加新项目。更改为更合适的类型可能是比必须转换集合更好的解决方案。
答案 7 :(得分:0)
动态类型工作(只有一件坏事,我必须链接windows.csharp和system.core dll,大约1MB,所以它不是最好的Silverlight应用程序,但它是最好的解决方案,我知道现在。)