Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用TypeBuilder通过构造函数将值从基类型分配给字符串_C#_Il_Typebuilder - Fatal编程技术网

C# 使用TypeBuilder通过构造函数将值从基类型分配给字符串

C# 使用TypeBuilder通过构造函数将值从基类型分配给字符串,c#,il,typebuilder,C#,Il,Typebuilder,我试图以编程方式定义一个具有基类的类,以及一个调用基类构造函数的构造函数。子类构造函数的部分工作是用值初始化名为name的字符串。但无论我尝试什么,名称都保持为空。基本构造函数工作正常,因为一些ArrayList已初始化等。Typesignature是一个字符串。基类中已存在字段名 FieldBuilder fbname = tb.DefineField("name", typeof(string), FieldAttributes.Public); ILGenerator ctor1IL =

我试图以编程方式定义一个具有基类的类,以及一个调用基类构造函数的构造函数。子类构造函数的部分工作是用值初始化名为name的字符串。但无论我尝试什么,名称都保持为空。基本构造函数工作正常,因为一些ArrayList已初始化等。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);
基类中已存在字段名

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
的字段。然后写入该字段,而不是基类中的字段

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);
你应该做的是:

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

…

ctor1IL.Emit(OpCodes.Stfld, nameField);