.net - que - mirtazapina engorda
¿Cuál es la mejor manera de crear un genérico a partir de su nombre? (3)
El artículo de MSDN Cómo: Examinar y crear instancias de tipos genéricos con reflexión describe cómo puede usar Reflection para crear una instancia de un tipo genérico. Usar eso junto con la muestra de Marksus debería ayudarte a comenzar.
Suponiendo que solo tengo el nombre de clase de un genérico como una cadena en la forma de "MyCustomGenericCollection (de MyCustomObjectClass)" y no conozco el ensamblaje del que proviene, ¿cuál es la forma más fácil de crear una instancia de ese objeto?
Si ayuda, sé que la clase implementa IMyCustomInterface y es de un ensamblado cargado en el AppDomain actual.
Markus Olsson dio un excelente ejemplo aquí , pero no veo cómo aplicarlo a los genéricos.
Si no te importa traducir a VB.NET, algo como esto debería funcionar
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
// find the type of the item
Type itemType = assembly.GetType("MyCustomObjectClass", false);
// if we didnt find it, go to the next assembly
if (itemType == null)
{
continue;
}
// Now create a generic type for the collection
Type colType = assembly.GetType("MyCusomgGenericCollection").MakeGenericType(itemType);;
IMyCustomInterface result = (IMyCustomInterface)Activator.CreateInstance(colType);
break;
}
Una vez que lo analice, use Type.GetType (cadena) para obtener una referencia a los tipos involucrados, luego use Type.MakeGenericType (Type []) para construir el tipo genérico específico que necesita. Luego, use Type.GetConstructor (Type []) para obtener una referencia a un constructor para el tipo genérico específico, y finalmente llame a ConstructorInfo.Invoke para obtener una instancia del objeto.
Type t1 = Type.GetType("MyCustomGenericCollection");
Type t2 = Type.GetType("MyCustomObjectClass");
Type t3 = t1.MakeGenericType(new Type[] { t2 });
ConstructorInfo ci = t3.GetConstructor(Type.EmptyTypes);
object obj = ci.Invoke(null);