2009-08-20 3 views
1

Ich verwende GetParameter, um festzustellen, welche Parameter der Konstruktor benötigt. Ich kann eine Liste von ihnen bekommen. Jetzt möchte ich den ctor aufrufen. Ist das möglich, wenn es kein leeres gibt?Ist es möglich, einen Konstruktor dynamisch mit relfection aufzurufen, wenn kein leerer Standardkonstruktor vorhanden ist?

+2

Welche Sprache? Ich weiß, dass es in Java möglich ist, aber es gibt eine Reihe anderer Sprachen, die diese Art von Reflektion unterstützen (wie C#). – Jonathan

+0

C# sicher. Danke Leute. Ich werde etwas davon ausprobieren. Prost. – topwik

Antwort

3

Welche Sprache? Für C# könnten Sie verwenden

Activator.CreateInstance(typeof(X), constructorparm1, constructorparam2...) 
+0

Also, was bekomme ich zurück? ein generisches Objekt? dass ich zu dem Typ, mit dem ich mich beschäftige, handeln kann? – topwik

+0

Sie erhalten ein Objekt zurück. Sie müssten es umwandeln oder den Operator AS verwenden, um das Objekt als den gewünschten Typ zu erhalten: X instance = (X) Activator.CreateInstance (typeof (X), constructorparm1, constructorparam2 ...) – saret

+0

Ich denke, die Frage Ich muss dann fragen, wie erstelle ich einen Systemtyp von einer ParameterInfo? Ich bekomme eine Liste von Parametern für meinen ctor. Ich bekomme paramInfo zurück, das sagt mir die ersten 2 sind Bools und die zweite 2 sind Ints. Jetzt muss ich ein Array erstellen, das 2 Bools enthält, entweder auf True oder Fase gesetzt (basierend auf Benutzereingaben von UI oder was auch immer) und 2 Ints auf Benutzereingaben von UI gesetzt oder was hast du ... – topwik

1

Ist das wonach Sie suchen? Dadurch wird eine Instanz von SqlConnection erstellt, die eine Zeichenfolge an den Konstruktor übergibt. Wenn Sie mehr Werte übergeben möchten, fügen Sie sie einfach zum Array hinzu.

 SqlConnection conn; 
     conn = (SqlConnection)System.Activator.CreateInstance(typeof(SqlConnection), new object[] { "Server=myserver" }); 
     Console.WriteLine(conn.ConnectionString); 
+0

ja! aber meine Parameter müssen dynamischer sein. Ich muss auf den Konstruktor schauen und wenn er Parameter hat, muss ich jeden Parameter betrachten und an seinem Systemtyp, wie boolean oder int, und dann ein Array dieser Parameter erstellen, ihren Wert setzen und diesen dann an das create übergeben Instanz oder ctor.invoke ... ParameterInfo [] pi = t.GetConstructors() [0] .GetParameters(); foreach (ParameterInfo p in Pi) { if (p ist boolesch) {args [idx] = new Boolean (true); } } Ich weiß es nicht. Etwas wie das. Ich bin mir nicht sicher, was möglich ist. } – topwik

+0

Geben Sie realType = Type.GetType (paramInfo.ParameterType.FullName); könnte den Trick machen. – topwik

+0

Vergiss das. Obwohl es wahrscheinlich einen komplizierten Weg gibt, dies zu tun, werde ich sicherstellen, dass jeder der in meiner Assembly deklarierten Typen einen leeren Standardkonstruktor hat, so dass ich mich beim Abrufen des Objekts nicht um die Parameter kümmern muss. Dann sollte es nur darum gehen, die Eigenschaften durchzugehen und die Werte darauf zu setzen ... hoffentlich ist das einfacher. Irgendwelche Kommentare? Jemand? Wenn es genauso hart ist, wird SO definitiv eine andere Frage von mir sehen! – topwik

Verwandte Themen