0

我想这样做

List<anotherclass> ls = new List<anotherclass> {new anotherclass{Name = "me"}};    
myGrid.ItemSource = ls;

在别的地方

var d = myGrid.ItemSource as IEnumerable<Object>;    
var e = d as ICollection<dynamic>;
e.Add(new anotherclass());

我需要在程序的不同区域访问 itemsource。我需要在没有编译时间类型信息的情况下将项目添加到列表中。转换为 IEnumerable 有效,但是因为我需要将项目添加到集合中,所以我需要的不止这些,因此尝试将其转换为集合。

怎么可能?

4

3 回答 3

3

List<T>实现IList。所以只要你确定你添加了正确类型的对象,你就可以使用Add这个接口的方法:

var d = (IList)myGrid.ItemSource;        
d.Add(new anotherclass());
于 2012-10-29T12:16:21.787 回答
2

问题不是:“它为什么起作用?”,因为事实上,它不起作用。它编译但它会抛出一个NullReferenceException.
d as ICollection<dynamic>将返回null,因为 anList<anotherclass>不是 anICollection<dynamic>而是 anICollection<anotherclass>并且ICollection<T>不是协变的。

KooKiz已经提供了解决方案。

于 2012-10-29T12:23:54.620 回答
0

试试这个:

var d =(List<anotherclass>) myGrid.ItemSource;
d.Add(new anotherclass());

我觉得直接做演员比较好。如果你使用 as 它会在尝试添加时抛出 nullreferenceException。最好让 invalidCastException 更好地描述问题所在。

于 2012-10-29T12:17:15.747 回答