Affectation d'une valeur à une chaîne à partir du type de base via le constructeur à l'aide de TypeBuilder

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

  •  21-12-2019
  •  | 
  •  

Question

J'essaie de définir par programme une classe avec une classe de base et un constructeur qui appelle le constructeur de base.Une partie du travail du constructeur de sous-classe consiste à initialiser une chaîne appelée name avec une valeur.Mais peu importe ce que j'essaie, le nom reste nul.Le constructeur de base fonctionne bien car certaines listes de tableaux sont initialisées, etc.La signature de type est une chaîne.Le nom du champ existe déjà dans la classe de base.

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);
Était-ce utile?

La solution

Le nom du champ existe déjà dans la classe de base.

On dirait que vous avez déjà le terrain name dans la classe de base.Si tel est le cas, votre code crée un autre champ appelé name dans la classe dérivée.Vous écrivez ensuite dans ce champ, et non dans celui de la classe de base.

Ce que vous devriez faire est quelque chose comme :

FieldInfo nameField = tb.BaseType.GetField("name");

…

ctor1IL.Emit(OpCodes.Stfld, nameField);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top