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

Я пытаюсь программно определить класс с базовым классом и конструктором, который вызывает базовый конструктор. Частью работы конструктора подкласса является инициализация строки с именем 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);

person user1296193    schedule 03.06.2014    source источник


Ответы (1)


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

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

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

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

…

ctor1IL.Emit(OpCodes.Stfld, nameField);
person svick    schedule 04.06.2014