2012-01-23 11 views
5

He estado creando una instancia dinámicamente con Activator.CreateInstance. Sin embargo, está diciendo que el objeto no puede ser nulo en cada intento. Pegando el código a continuación. ¿Estoy haciendo algo mal?Activator.CreateInstance falla

¿Hay algún problema si

Activator.CreateInstance

reemplaza las declaraciones convencionales switch/case para determinar el tipo de objeto en el tiempo de ejecución? Gracias.

public abstract class Base 
{ 
    public abstract void Func(); 

} 
public class Derived:Base 
{ 
    public override void Func() 
    { 
     MessageBox.Show("Derived First"); 
    } 
} 

public class Derived2 : Base 
{ 
    public override void Func() 
    { 
     MessageBox.Show("Derived Second"); 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    // I was trying to make use of the overladed version 
    // where it takes the Type as parameter. 
    BaseClass report = 
     (BaseClass) Activator.CreateInstance(Type.GetType("Derived")); 
    report.Func(); 
} 
+0

¿Por qué no usar typeof() en lugar de Type.GetType() ?? –

Respuesta

3

De la documentación del parámetro typeName de Type.GetType:

El nombre de ensamblado calificado del tipo de conseguir. Consulte AssemblyQualifiedName. Si el tipo está en el ensamblado actualmente en ejecución o en Mscorlib.dll, es suficiente con proporcionar el nombre de tipo calificado por su espacio de nombre.

Esto significa que usted necesita para pasar (al menos) el espacio de nombres, así:

BaseClass report = (BaseClass) Activator.CreateInstance(Type.GetType("YourNamespace.Derived")); 
1

El método GetType está fallando y devuelve nulo. Ver la sección de parámetros del enlace anterior.

El nombre calificado para el ensamblaje del tipo que se va a obtener. Ver AssemblyQualifiedName. Si el tipo está en el ensamblado que se está ejecutando actualmente o en Mscorlib.dll, es suficiente proporcionar el nombre de tipo calificado por su espacio de nombre.

Añadir el espacio de nombres antes de "Derived" y si la clase es Derived en un montaje diferente, a continuación, añadir ", assemblyname" hasta el final.


Tenga en cuenta que si no va a variar la cadena que pasa en GetType, entonces es posible que utilices typeof(Derived) (aunque en ese caso no hay mucho punto utilizando Activator.CreateInstance).

3

Bueno, Type.GetType("Derived") es casi seguro que devuelva NULL - lo que haría nada que ver con Activator.CreateInstance.

Comprobar:

  • Es Derived en el mismo conjunto que el código de llamada? De lo contrario, use Assembly.GetType en el ensamblaje de la derecha o incluya el nombre del ensamblado en el nombre de tipo que está pasando a Type.GetType()
  • ¿Es su tipo en un espacio de nombres?Si es así, es necesario espacio de nombres calificarlo
+0

¿Hay algún problema si este método reemplaza las instrucciones convencionales de interruptor/caja para determinar el tipo de objeto en el tiempo de ejecución? Gracias. – logeeks

+0

@logeeks: No es muy claro a qué te refieres, para ser sincero. –

+0

En mi programa recibo un valor enum del servidor. ese valor enum determinará qué objeto debe crearse. por ejemplo: Mammal mb; interruptor (MammalType): caso Cat: mb = new Cat(); descanso; case Dog: mb = new Dog(); Me preguntaba si de alguna manera puedo recuperar el nombre del valor de la enumeración, puedo usarlo para construir el objeto de la clase en una única declaración en lugar de depender de la declaración de mayúsculas y minúsculas. ¿Este enfoque tiene algún inconveniente? – logeeks

3

Type.GetType("Derived" no puede encontrar el tipo

Simeple cambiar

BaseClass report = (BaseClass) Activator.CreateInstance(Type.GetType("Derived")); 

a este

Base report = (Base)Activator.CreateInstance(typeof(Derived)); 
+1

En ese caso, supongo que 'Base informe = nuevo Derived();' sería aún más simple? –

+0

Sí, pero creo que esta (la pregunta) fue solo una muestra. – dknaack

+2

Creo que también, pero también creo que un punto clave es que el tipo no se conoce en tiempo de compilación. Si lo es (como en su respuesta), no es necesario usar 'Activator.CreateInstance' en absoluto. –

0

en tiempo de ejecución, su llamada GetType se return null. Usted tiene que:

  • sea preciso el espacio de nombres
  • o uso typeof
Cuestiones relacionadas