2012-01-18 12 views
6

AのインスタンスをList<A>BList<B>などに正しく追加するには、このスニペットをどのように変更すればよいですか?Tをリストに追加する方法<T>リスト<T>は「動的」、Tは「オブジェクト」となります。

// someChild's actual type is A 
object someChild = GetObject(); 
// collection's actual type is List<A> though method below returns object 
dynamic list = GetListFromSomewhere(...); 
// code below throws a RuntimeBinderException 
list.Add(somechild); 

Add()がバインダーによって発見されている間、それはオーバーロード解決に失敗したdynamicに渡し、ため例外がスローされます。私はではなく、を使用してリフレクションを使用するか、少なくともそれを最小限に抑えることができます。私はAList<A>のそれぞれに対してのインスタンスにアクセスできます。上記のコードを含むクラスまたはメソッド自体は一般的ではありません。

答えて

2

必要なのは、あまりにもダイナミック引数に結合することです - ので、あなただけのdynamicするsomeChildの種類を必要とする:

あなたの前のコードで
dynamic someChild = GetObject(); 
dynamic list = GetListFromSomewhere(...); 
list.Add(somechild); 

、コンパイラははそのを覚えているだろうsomeChildのコンパイル時型はobjectであり、実行時型の代わりにそのコンパイル時型が使用されていました。実行時バインダは、過負荷解決のためにダイナミック式を動的に扱うだけでスマートです。

1

Jonの権利、私はそれを受け入れたが、List<T>IList(非ジェネリック版)を実装することを自分の物忘れもありますので:

object someChild = GetObject(); 
var list = (IList)GetListFromSomewhere(...); 
list.Add(somechild); 
は、
関連する問題