Compact Framework - ¿cómo puedo crear dinámicamente el tipo con ningún constructor predeterminado?
-
09-06-2019 - |
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
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!;-)