2010-03-22 10 views
5

Estoy probando un poco de reflexión y tengo una pregunta sobre cómo el reparto del objeto de resultado a un IList.C# - objeto colado a IList <T> basada en el tipo

Aquí es el reflejo:

private void LoadBars(Type barType) 
{ 
    // foo has a method that returns bars 
    Type foo = typeof(Foo); 

    MethodInfo method = foo.GetMethod("GetBars") 
     .MakeGenericMethod(bar); 

    object obj = method.Invoke(foo, new object[] { /* arguments here */ }); 
    // how can we cast obj to an IList<Type> - barType 
} 

¿Cómo podemos emitir el resultado de method.Invoke a un IList de texto, desde el argumento barType?

Respuesta

5

El objetivo de un elenco suele ser decirle al compilador que tiene información adicional, que usted sabe algo al tiempo de compilación. No conoce esa información aquí; solo la conoce al tiempo de ejecución.

¿Qué esperaría que ver con el valor después de la fundición que? Es cierto que hay algunas veces cuando sería útil, cuando debe utilizar una interfaz genérica, incluso si desea obtener miembros que no requieren el parámetro de tipo (por ejemplo, Count en IList<T>). Sin embargo, si eso no es lo que estás tratando de hacer, realmente sería útil si pudieras dar más información.

+0

Queremos iterar la lista como tipo fundido. Lo cual, reconozco, no tiene ningún sentido, necesitamos decirle al compilador el tipo para que genere lo que necesita. El objetivo de la pregunta era explorar un caso extremo que realmente es un hack alrededor de una irregularidad de LOB. Gracias por presentarme claramente el problema. – blu

0

En .NET 4.0 se puede utilizar árboles de expresión a que achive.

0
private void LoadBars<T>() 
{ 
    Type barType = typeof(T); 
    // foo has a method that returns bars 
    Type foo = typeof(Foo); 

    MethodInfo method = foo.GetMethod("GetBars") 
     .MakeGenericMethod(bar); 

    IList<T> obj = (IList<T>)method.Invoke(foo, new object[] { /* arguments here */ }); 
} 
+1

Exactamente, pero ahora T debe conocerse en tiempo de compilación. – Radu094

0

Fundición sólo tendría sentido si el llamador de la función de su nueva barType en tiempo de compilación, y no un tiempo de ejecución . Y una vez que eso sea cierto, puede simplemente crear una plantilla de la función a:

private IList<T> LoadBars<T>() 
{ 
... 
return obj as IList<T>; 
} 
4

Acabo de terminar de luchar con este problema.
Es cierto que no puede convertir el objeto en un IList genérico, pero puede convertirlo en una matriz fuertemente tipada invocando el método "ToArray" del objeto List.

Solución robada de otro blog. http://amazedsaint.blogspot.com/2008/04/creating-generic-list-at-runtime.html

ToArrayMethod = obj.GetType(). GetMethod ("ToArray");

System.Array stronglyTypedArray = (System.Array) ToArrayMethod.Invoke (obj, null);

Cuestiones relacionadas