Compact Framework - comment créer dynamiquement un type sans constructeur par défaut ?

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

Question

J'utilise le .NET CF 3.5.Le type que je souhaite créer n'a pas de constructeur par défaut, je souhaite donc transmettre une chaîne à un constructeur surchargé.Comment puis-je faire cela?

Code:

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
Était-ce utile?

La solution

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

Autres conseils

@Jonathan Parce que le Compact Framework doit être aussi mince que possible.S'il existe une autre façon de faire quelque chose (comme le code que j'ai publié), ils ne dupliquent généralement pas la fonctionnalité.

Rory Blyth a un jour décrit le Compact Framework comme « un wrapper autour de System.NotImplementedExcetion ».:)

Ok, voici une méthode d'assistance géniale pour vous donner un moyen flexible d'activer un type à partir d'un ensemble de paramètres :

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

Et tu l'appelles ainsi :

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

Vous transmettez donc l'assembly et le nom du type comme deux premiers paramètres, puis tous les paramètres du constructeur dans l'ordre.

Voyez si cela fonctionne pour vous (non testé) :

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 le type a plus d'un constructeur, vous devrez peut-être faire quelques démarches sophistiquées pour trouver celui qui accepte votre paramètre de chaîne.

Modifier:Je viens de tester le code, et ça marche.

Edit2 : La réponse de Chris montre le jeu de jambes sophistiqué dont je parlais !;-)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top