2008-08-27 9 views
6

Ich benutze das .NET CF 3.5. Der Typ, den ich erstellen möchte, hat keinen Standardkonstruktor, deshalb möchte ich eine Zeichenfolge an einen überladenen Konstruktor übergeben. Wie mache ich das?Compact Framework - Wie erstelle ich dynamisch einen Typ ohne Standardkonstruktor?

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 

Antwort

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

sehen, ob dies für Sie arbeitet (ungetestet):

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; 

Wenn der Typ mehr als ein Konstruktor hat, dann können Sie haben einige Beinarbeit zu tun, die finden eine, die den String-Parameter akzeptiert.

Edit: Nur den Code getestet, und es funktioniert.

Edit2: Chris' answer zeigt die ausgefallene Fußarbeit, über die ich sprach! ;-)

4

@ Jonathan Weil das Compact Framework so schlank wie möglich sein muss. Wenn es einen anderen Weg gibt, etwas zu tun (wie der Code, den ich gepostet habe), duplizieren sie im Allgemeinen nicht die Funktionalität.

Rory Blyth beschrieb das Compact Framework einmal als "Wrapper um System.NotImplementedExcetion". :)

1

Ok, hier ist eine funky Hilfsmethode Ihnen eine flexible Möglichkeit zu geben, eine Art eine Reihe von Parametern angegeben zu aktivieren:

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

Und Sie nennen es wie folgt aus:

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

So übergeben Sie die Assembly und den Namen des Typs als die ersten beiden Parameter und dann alle Parameter des Konstruktors in Reihenfolge.