El título es un poco oscuro. Lo que quiero saber es si esto es posible:
string typeName = <read type name from somwhere>;
Type myType = Type.GetType(typeName);
MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>();
Obviamente, MyGenericClass se describe como:
public class MyGenericClass<T>
En este momento, el compilador se queja de que 'El tipo o espacio de nombres' myType 'no se pudo encontrar ". Tiene que haber una manera de hacerlo.
foo.Method((dynamic)myGenericClass)
para el enlace del método en tiempo de ejecución, efectivamente el patrón del localizador de servicios para las sobrecargas de métodos de un tipo.public void Method<T>(T obj)
: un truco que he usado más de unas pocas veces en los últimos 6 años desde ese comentario; pRespuestas:
No puedes hacer esto sin reflexionar. Sin embargo, usted puede hacerlo con la reflexión. Aquí hay un ejemplo completo:
Nota: si su clase genérica acepta varios tipos, debe incluir las comas cuando omita los nombres de los tipos, por ejemplo:
fuente
Lamentablemente no, no hay. Los argumentos genéricos deben poder resolverse en tiempo de compilación como 1) un tipo válido u 2) otro parámetro genérico. No hay forma de crear instancias genéricas basadas en valores de tiempo de ejecución sin el gran martillo de usar la reflexión.
fuente
Algunas formas adicionales de ejecutar con código de tijera. Supongamos que tienes una clase similar a
Supongamos que en tiempo de ejecución tienes un FooContent
Si pudieras enlazar en tiempo de compilación, querrías
Sin embargo, no puede hacer esto en tiempo de ejecución. Para hacer esto en tiempo de ejecución, haría lo siguiente:
Invocar dinámicamente
Markdown(IEnumerable<FooContent> contents)
Tenga en cuenta el uso de
dynamic
en la llamada al método. En el tiempo de ejecucióndynamicList
seráList<FooContent>
(además de serloIEnumerable<FooContent>
), ya que incluso el uso de la dinámica todavía está enraizado en un lenguaje fuertemente tipado, el enlazador de tiempo de ejecución seleccionará elMarkdown
método apropiado . Si no hay coincidencias de tipo exactas, buscará un método de parámetro de objeto y si ninguna coincide, se generará una excepción de carpeta de tiempo de ejecución alertando que ningún método coincide.El inconveniente obvio de este enfoque es una gran pérdida de seguridad de tipo en tiempo de compilación. Sin embargo, el código a lo largo de estas líneas le permitirá operar en un sentido muy dinámico que en tiempo de ejecución todavía está completamente escrito como espera que sea.
fuente
Mis requisitos eran ligeramente diferentes, pero espero que ayuden a alguien. Necesitaba leer el tipo de una configuración e instanciar el tipo genérico dinámicamente.
Finalmente, así es como lo llamas. Defina el tipo con un backtick .
fuente
Si sabe qué tipos se pasarán, puede hacerlo sin reflexionar. Una declaración de cambio funcionaría. Obviamente, esto solo funcionaría en un número limitado de casos, pero será mucho más rápido que la reflexión.
fuente
En este fragmento, quiero mostrar cómo crear y usar una lista creada dinámicamente. Por ejemplo, estoy agregando a la lista dinámica aquí.
Del mismo modo, puede invocar cualquier otro método en la lista.
fuente