visual tag metodo crear c# reflection compact-framework

tag - metodo constructor c#



Marco compacto: ¿cómo creo dinámicamente el tipo sin un constructor predeterminado? (4)

@ Jonathan porque el marco compacto 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 envoltorio alrededor de System.NotImplementedExcetion". :)

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?

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


Ok, aquí hay un método funky helper para darle una forma flexible de activar un tipo dado una matriz 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 lo llamas así:

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

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


Vea 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, entonces puede que tenga que hacer un trabajo de pies elegante para encontrar el que acepte su parámetro de cadena.

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

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


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