Frage

Ich verwende .NET CF 3.5.Der Typ, den ich erstellen möchte, verfügt nicht über einen Standardkonstruktor, daher möchte ich eine Zeichenfolge an einen überladenen Konstruktor übergeben.Wie mache ich das?

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
War es hilfreich?

Lösung

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

Andere Tipps

@Jonathan Weil das Compact Framework so schlank wie möglich sein muss.Wenn es eine andere Möglichkeit gibt, etwas zu tun (wie den Code, den ich gepostet habe), wird die Funktionalität im Allgemeinen nicht dupliziert.

Rory Blyth beschrieb das Compact Framework einmal als „einen Wrapper um System.NotImplementedExcetion“.:) :)

Ok, hier ist eine coole Hilfsmethode, die Ihnen eine flexible Möglichkeit bietet, einen Typ mit einer Reihe von Parametern 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 du nennst es so:

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

Sie übergeben also als erste beiden Parameter die Assembly und den Namen des Typs und dann der Reihe nach alle Parameter des Konstruktors.

Sehen Sie, ob dies für Sie funktioniert (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 über mehr als einen Konstruktor verfügt, müssen Sie möglicherweise einige komplizierte Schritte unternehmen, um den Konstruktor zu finden, der Ihren String-Parameter akzeptiert.

Bearbeiten:Habe gerade den Code getestet und er funktioniert.

Edit2: Chris' Antwort zeigt die ausgefallene Beinarbeit, von der ich gesprochen habe!;-)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top