Asignación de valor a cadena del tipo de base a través del constructor usando TymBuilder

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

  •  21-12-2019
  •  | 
  •  

Pregunta

Estoy tratando de definir programáticamente una clase con una clase base, y un constructor que llama al constructor base.Parte del trabajo del constructor de subclase es inicializar una cadena llamada nombre con un valor.Pero no importa lo que intente el nombre sigue siendo nulo.El constructor base funciona bien porque se inicializan algunos arreglos de matriz, etc. TIPSIGINATE es una cadena.El nombre del campo ya existe en la clase 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);

¿Fue útil?

Solución

El nombre del campo ya existe en la clase base.

Esto suena como si ya tienes el campo name en la clase base.Si ese es el caso, lo que hace su código es crear otro campo llamado name en la clase derivada.Luego escribes a ese campo, no a la de la clase base.

Lo que debes hacer es algo así:

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

…

ctor1IL.Emit(OpCodes.Stfld, nameField);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top