Member welche per Reflection herausgefunden wurde, ohne Reflection setzen
-
Gibt es für folgendes Szenario eine Möglichkeit:
Für eine Klasse lese ich per Reflection die Membervariablen aus. Für diese möchte ich nun get und set-funktionen erzeugen. Kurzum: beim aufruf einen bestimmten Delegates wird genau dieser Wert gesetzt.
Direkt würde ich das so machen:
setter = delegate(Object o) { this.MyVar = (MyVarCast)o; }; getter = delegate() { return this.MyVar };
Wenn ich aber per Reflection herausfinde das eine Variable MyVar existiert kann ich die ja nur per Reflection aufrufen. D.H. bei jeden Call des Delegates würde ich ein FieldObject erzeugen müssen und darüber das ganze aufrufen. Kann ich das umgehen? Also wirklich so einen Aufruf wie im Code erzeugen?
-
Hab dafür nun eine Lösung gefunden indem ich Per IL die Get und Set Methoden dynamisch generiere und dafür die Delegates Speichere. Interessanterweise ist das ganze ca 20 % Schneller als bei "Händisch" Programmierten Delegates. Dummerweise braucht das generieren der Dynamischen Funktionen so lange dadurch ist der Constructor einer Klasse welche die Delegates Händisch setzt um den Faktor 200 schneller als einer, der dies per dynamischen Modules löst. Ich glaube aber nicht das ich das umgehen kann.
-
Ich schätze jetzt einfach mal ins Blaue,das du eventuell Code zur Laufzeit erstellen willst, eventuell solltest du dir mal ExpressionTrees anschauen, mit denen kannst du ganze Klassen usw erzeugen.
-
Hmm ich werde mich wohl hobbymässig mit den Expressiontrees noch näher beschäftigen, das klingt auch interessant. Gelöst hab ichs aktuell mit DynamicMethod. Ich glaube aber das die Lösungen weniger zum Einsatz kommen werden. Da auch die Codegenerierung sehr langsam ist.
-
Wieso willst du zur laufzeit Code erstellen? Wie ist der ablauf?
1. Start
2. Code erzeugen
3. Code verwenden
4. Code verwerfen
5. Ende
???
-
Eigentlich ist der Code schon zur Compilezeit bekannt. Mir fiel nur keine bessere Möglichkeit ein. Ich verwende das ganze um beim Erzeugen einer Klasse eine Art "ReflectionTable" auf zu bauen damit dann die Zugriff nicht mehr über die Member gehen müssen (zumindest das ich zugriffe über ein Interface steuern kann).
Ich scanne also alle member einer konkreten Implementation einer Klasse nach Membervariablen durch und baue über die möglichkeit dafür Get und Set Methoden nach einen bestimmten Schema. Wie schon gesagt, eigentlich gänge das zur Compilezeit. Ich wüsste aber nicht wie ich das effektiv machen könnte.