objetos - llamar una clase en c#
c#instanciar clase de cadena (3)
Tengo una clase abstracta y quiero iniciarla en una clase que la amplíe.
Tengo el nombre de las clases secundarias como una cadena.
Aparte de esto...
String childClassString;
MyAbstractClass myObject;
if (childClassString = "myExtenedObjectA")
myObject = new ExtenedObjectA();
if (childClassString = "myExtenedObjectB")
myObject = new ExtenedObjectB();
¿Cómo puedo hacer esto? Básicamente, ¿cómo me deshago de las declaraciones if aquí?
Creo que esto debería funcionar:
myObject = (MyAbstractClass)Activator.CreateInstance(null, childClassString);
El null
en el primer parámetro se establece de manera predeterminada en el ensamblaje de ejecución actual. Para obtener más referencia: MSDN
editar: se olvidó de lanzar a MyAbstractClass
Mire Activator.CreateInstance ().
myObject = (MyAbstractClass)Activator.CreateInstance("AssemblyName", "TypeName");
o
var type = Type.GetType("MyFullyQualifiedTypeName");
var myObject = (MyAbstractClass)Activator.CreateInstance(type);
Tuve algunas dificultades para implementar algunas de las respuestas aquí porque estaba intentando crear una instancia de un objeto de un ensamblaje diferente (pero en la misma solución). Así que pensé en publicar lo que encontré para trabajar.
Primero, el método Activator.CreateInstance
tiene varias sobrecargas. Si solo llama a Activator.CreateInstance(Type.GetType("MyObj"))
, eso supone que el objeto está definido en el ensamblado actual y devuelve un MyObj
.
Si lo llamas como se recomienda en las respuestas aquí: Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName)
, luego devuelve un ObjectHandle
, y necesitas llamar a Unwrap()
para obtener tu objeto. Esta sobrecarga es útil cuando se intenta llamar a un método definido en un ensamblaje diferente (por cierto, puede usar esta sobrecarga en el ensamblaje actual, simplemente deje nulo el parámetro AssemblyName
).
Ahora, descubrí que la sugerencia anterior de utilizar typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName
para AssemblyName
realidad me dio errores, y no pude conseguir que funcionara. System.IO.FileLoadException
(no podría cargar archivo o ensamblado ...).
Lo que sí llegué a trabajar es el siguiente:
var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject");
MyObject obj = (MyObject)container.Unwrap();
obj.DoStuff();