2008-08-27 11 views
6

Estoy usando .NET CF 3.5. El tipo que quiero crear no tiene un constructor predeterminado, así que quiero pasar una cadena a un constructor sobrecargado. ¿Cómo hago esto?Compact Framework: ¿cómo creo dinámicamente el tipo sin un constructor predeterminado?

Código:

Assembly a = Assembly.LoadFrom("my.dll"); 
Type t = a.GetType("type info here"); 
// All ok so far, assembly loads and I can get my type 

string s = "Pass me to the constructor of Type t"; 
MyObj o = Activator.CreateInstance(t); // throws MissMethodException 

Respuesta

9
MyObj o = null; 
Assembly a = Assembly.LoadFrom("my.dll"); 
Type t = a.GetType("type info here"); 

ConstructorInfo ctor = t.GetConstructor(new Type[] { typeof(string) }); 
if(ctor != null) 
    o = ctor.Invoke(new object[] { s }); 
0

A ver si esto funciona para usted (no probado):

Type t = a.GetType("type info here"); 
var ctors = t.GetConstructors(); 
string s = "Pass me to the ctor of t"; 
MyObj o = ctors[0].Invoke(new[] { s }) as MyObj; 

Si el tipo tiene más de un constructor, puede que tenga que hacer algún juego de piernas para encontrar el uno que acepta su parámetro de cadena.

Edición: Acabo de probar el código, y funciona.

Edit2: Chris' answer ¡muestra el juego de piernas elegante del que estaba hablando! ;-)

4

@Jonathan Porque Compact Framework tiene que ser lo más delgado posible. Si hay otra forma de hacer algo (como el código que publiqué), generalmente no duplican la funcionalidad.

Rory Blyth una vez describió el Compact Framework como "un contenedor alrededor de System.NotImplementedExcetion". :)

1

autorización, aquí es un método de ayuda cobarde para darle una forma flexible para activar un tipo dado una serie de parámetros:

static object GetInstanceFromParameters(Assembly a, string typeName, params object[] pars) 
{ 
    var t = a.GetType(typeName); 

    var c = t.GetConstructor(pars.Select(p => p.GetType()).ToArray()); 
    if (c == null) return null; 

    return c.Invoke(pars); 
} 

Y que lo llaman así:

Foo f = GetInstanceFromParameters(a, "SmartDeviceProject1.Foo", "hello", 17) as Foo; 

Así que pasa el ensamblaje y el nombre del tipo como los dos primeros parámetros, y luego todos los parámetros del constructor en orden.

Cuestiones relacionadas