Присвоение значения строке из базового типа через конструктор с использованием TypeBuilder

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

  •  21-12-2019
  •  | 
  •  

Вопрос

Я пытаюсь программно определить класс с базовым классом и конструктором, который вызывает базовый конструктор.Частью работы конструктора подкласса является инициализация строки с именем name значением.Но что бы я ни пробовал, имя остается пустым.Базовый конструктор работает нормально, потому что некоторые списки массивов инициализированы и т.д.Typesignature - это строка.Имя поля уже существует в базовом классе.

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);
Это было полезно?

Решение

Имя поля уже существует в базовом классе.

Это звучит так, как будто у вас уже есть поле name в базовом классе.Если это так, то то, что делает ваш код, - это создает другой поле, называемое name в производном классе.Затем вы записываете в это поле, а не в поле в базовом классе.

То, что вы должны сделать, это что-то вроде:

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

…

ctor1IL.Emit(OpCodes.Stfld, nameField);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top