2012-01-18 15 views
6

Jak mogę zmienić ten fragment kodu, aby poprawnie dodać wystąpienie A do List<A>, B do List<B> itp.?Jak dodać T do listy <T> gdzie lista <T> maskuje się jako "dynamiczny", a T jako "obiekt"?

// 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); 

jest wyjątek gdyż podczas Add() znajduje się w spoiwie, jest on przechodzi dynamic która nie rozdzielczość przeciążeniem. Wolę niż, aby zmienić powyższe, aby użyć odbicia, lub przynajmniej aby to zminimalizować. Mam dostęp do instancji System.Type dla każdego z A i List<A>. Klasa lub metoda zawierająca powyższy kod sama w sobie nie jest generyczna.

Odpowiedz

2

Wszystko, co potrzebne jest, aby wiążące dla argumentu dynamiczny też - więc wystarczy typ someChild być dynamic:

dynamic someChild = GetObject(); 
dynamic list = GetListFromSomewhere(...); 
list.Add(somechild); 

W poprzedniej kodu, kompilator musiałby pamiętał że Typ kompilacji someChild był object, więc używał tego typu kompilacji zamiast typu czas wykonania. Spoiwo czasu wykonania jest inteligentne tylko w dynamicznym traktowaniu dynamicznych wyrażeń w celu uzyskania rozdzielczości przeciążenia.

1

prawo Jona więc przyjąłem, ale tam też moja własna zapominanie, że List<T> realizuje IList (wersja non-generic):

object someChild = GetObject(); 
var list = (IList)GetListFromSomewhere(...); 
list.Add(somechild); 
Powiązane problemy