ICollection演员问题

时间:2010-07-03 08:30:05

标签: c# .net silverlight

有没有解决这个演员示例问题的解决方案?我需要在集合中添加一个新元素,所以我必须解决它。

    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

8 个答案:

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