2010-04-15 16 views
5
sTypeName = ... //do some string stuff here to get the name of the type 

/* 
The Assembly.CreateInstance function returns a type 
of System.object. I want to type cast it to 
the type whose name is sTypeName. 

assembly.CreateInstance(sTypeName) 

So, in effect I want to do something like: 

*/ 

assembly.CreateInstance(sTypeName) as Type.GetType(sTypeName); 

¿Cómo puedo hacer eso? Y, ¿qué debo tomar en el lado izquierdo de la expresión de asignación, suponiendo que esto es C# 2.0. No tengo la palabra clave var.Typecast a un tipo de solo la cadena de representación del tipo nombre

Respuesta

2

Por lo general, permite todas las clases, quiere crear una instancia de forma dinámica, implementa una interfaz común, digamos IMyInterface. Se puede crear una instancia de la cadena de nombre de clase como esta:

Assembly asm = Assembly.GetExecutingAssembly(); 
string classname = "MyNamespace.MyClass"; 
Type classtype = asm.GetType(classname); 

// Constructor without parameters 
IMyInterface instance = (IMyInterface)Activator.CreateInstance(classtype); 

// With parameters (eg. first: string, second: int): 
IMyInterface instance = (IMyInterface)Activator.CreateInstance(classtype, 
         new object[]{ 
          (object)"param1", 
          (object)5 
         }); 

Incluso si usted no tiene una interfaz común, pero saber el nombre del método (como cadena) puede invocar sus métodos como esto (muy similar para propiedades, eventos y así sucesivamente):

object instance = Activator.CreateInstance(classtype); 

int result = (int)classtype.GetMethod("TwoTimes").Invoke(instance, 
         new object[] { 15 }); 
// result = 30 

La clase ejemplo:

namespace MyNamespace 
{ 
    public class MyClass 
    { 
     public MyClass(string s, int i) { } 

     public int TwoTimes(int i) 
     { 
      return i * 2; 
     } 
    } 
} 
2

Desafortunadamente no hay manera en .NET de hacer lo que quiera.

soluciones parciales posibles son:

  1. Si conoce el tipo en tiempo de compilación (poco probable, ya que va a crear en tiempo de ejecución de una cadena) a continuación, simplemente echar a ese tipo:

    YourType t = (YourType)Activator.CreateInstance(sTypeName); 
    
  2. Si usted sabe que todos los posibles tipos implementarán una interfaz específica, común entonces usted puede echar a esa interfaz en su lugar:

    IYourInterface i = (IYourInterface)Activator.CreateInstance(sTypeName); 
    

Si no puede hacer ninguna de las anteriores, desafortunadamente, está atascado con object y la reflexión.

+0

Gracias, ya lo había hecho (2) y estaba buscando opciones. –

2

.

definir un método genérico en su clase, y luego se puede convertir así:

public T Cast<T>(object obj) 
{ 
     return (T) obj; 
} 

string sTypename = "SomeClassName"; 
MethodInfo cast = this.GetType().GetMethod("Cast"); 
MethodInfo genericCast = cast.MakeGenericMethod(new Type[] { Type.GetType(sTypename) }); 
Object castedValue = genericCast.Invoke(this, new object[] { instanceToBeCasted }); 

Pero luego pienso, ¿cuál es el punto de dicha colada si no se puede almacenar el valor fundido en una variable de el tipo real, precisamente porque no se conoce el tipo real al momento de escribir el código?

Cuestiones relacionadas