Compact Framework - ¿cómo puedo crear dinámicamente el tipo con ningún constructor predeterminado?

StackOverflow https://stackoverflow.com/questions/29436

Pregunta

Estoy con el .NET CF 3.5.El tipo quiero crear no tiene un constructor por defecto, así que quiero pasar una cadena a un constructor sobrecargado.¿Cómo puedo hacer esto?

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
¿Fue útil?

Solución

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 });

Otros consejos

@Jonathan Debido a que el Compact Framework tiene que ser tan delgado como sea posible.Si hay otra manera de hacer algo (como el código que he publicado), a continuación, por lo general, no duplicar la funcionalidad.

Rory Blyth una vez descrito el Compact Framework como "un contenedor de Sistema.NotImplementedExcetion".:)

Ok, aquí trata de un original método auxiliar para darle una forma flexible para activar un tipo dado un array 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 se llama así:

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

Así se pasa de la asamblea y el nombre del tipo como los dos primeros parámetros y, a continuación, todos los parámetros del constructor en orden.

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, a continuación, puede que tenga que hacer algunos pasos elegantes para encontrar el que acepta su parámetro de cadena.

Editar:Sólo probado el código, y funciona.

Edit2: Chris respuesta muestra el fancy footwork yo estaba hablando!;-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top