Zuweisen eines Werts zu einer Zeichenfolge vom Basistyp über den Konstruktor mithilfe von TypeBuilder
-
21-12-2019 - |
Frage
Ich versuche, programmgesteuert eine Klasse mit einer Basisklasse und einem Konstruktor zu definieren, der den Basiskonstruktor aufruft.Ein Teil der Aufgabe des Unterklassenkonstruktors besteht darin, eine Zeichenfolge namens „name“ mit einem Wert zu initialisieren.Aber egal, was ich versuche, der Name bleibt null.Der Basiskonstruktor funktioniert einwandfrei, da einige Arraylisten initialisiert werden usw.Typesignature ist eine Zeichenfolge.Der Feldname ist bereits in der Basisklasse vorhanden.
FieldBuilder fbname = tb.DefineField("name", typeof(string), FieldAttributes.Public);
ILGenerator ctor1IL = ctor1.GetILGenerator();
ctor1IL.Emit(OpCodes.Ldarg_0);
//get base constructor
var bc = tb.BaseType.GetConstructor(System.Type.EmptyTypes);
ctor1IL.Emit(OpCodes.Call, bc);
ctor1IL.Emit(OpCodes.Ldarg_0);
ctor1IL.Emit(OpCodes.Ldstr, typeSignature);
ctor1IL.Emit(OpCodes.Stfld, fbname);
ctor1IL.Emit(OpCodes.Ret);
Lösung
Der Feldname ist bereits in der Basisklasse vorhanden.
Das hört sich so an, als hätten Sie das Feld bereits name
in der Basisklasse.Wenn dies der Fall ist, erstellt Ihr Code ein anderer Feld aufgerufen name
in der abgeleiteten Klasse.Sie schreiben dann in dieses Feld, nicht in das in der Basisklasse.
Was Sie tun sollten, ist etwa:
FieldInfo nameField = tb.BaseType.GetField("name");
…
ctor1IL.Emit(OpCodes.Stfld, nameField);