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. anは an ではなくandは共変でないため、
d as ICollection<dynamic>返されます。nullList<anotherclass>ICollection<dynamic>ICollection<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 に答える