2012-01-18 18 views
6

¿Cómo puedo obtener cambiar este fragmento para agregar correctamente una instancia de A a List<A>, B a List<B>, etc.?Cómo agregar una T a la lista <T> donde la lista <T> se enmascara como 'dinámica' y T como 'objeto'?

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

La excepción se produce porque, mientras que la Add() se encuentra por el aglutinante, que pasa en dynamic que falla resolución de sobrecarga. Prefiero no para cambiar lo anterior para usar la reflexión, o al menos para minimizar eso. Tengo acceso a la instancia de System.Type para cada uno de A y List<A>. La clase o el método que contiene el código anterior en sí no es genérico.

Respuesta

2

Todo lo que necesita es hacer la unión para el argumento dinámico también - lo que sólo necesita el tipo de someChild ser dynamic:

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

En el código anterior, el compilador tendría recordado que el tipo de tiempo de compilación de someChild era object, por lo que usaba ese tipo de tiempo de compilación en lugar del tipo de tiempo de ejecución. El enlazador de tiempo de ejecución es inteligente para tratar dinámicamente solo las expresiones dinámicas para la resolución de sobrecarga.

1

derecha de Jon así que acepté eso, sino que también es mi propia olvido que implementa List<T>IList (la versión no genérica):

object someChild = GetObject(); 
var list = (IList)GetListFromSomewhere(...); 
list.Add(somechild); 
Cuestiones relacionadas