Zuweisen eines Werts zu einer Zeichenfolge vom Basistyp über den Konstruktor mithilfe von TypeBuilder

StackOverflow https://stackoverflow.com//questions/24022452

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

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top