我尝试发出动态方法,通过某些值设置类的字段,当常规字段的类型为struct时,我想设置具有新结构的字段,如下所示:var myStruct = new SomeStruct( );
。
但我无法找到该结构的默认构造函数。
var type = valueForField.GetType ( );
if( type.IsValueType && !type.IsPrimitive && !type.IsEnum )
{
emit
.ldarg_0
.newobj ( type.GetConstructor( Type.EmptyTypes ) )
.stfld ( field );
continue;
}
由于将null传递给 newobj 函数
,它在第.newobj ( type.GetConstructor( Type.EmptyTypes ) )
行失败
有人能通过默认构造函数告诉我如何发布新的结构吗?
答案 0 :(得分:1)
使用initobj
.ldarg_0
.ldflda (field)
.initobj (type)
来自msdn:
通常不使用newobj创建值类型。它们通常使用newarr(对于从零开始的一维数组)或作为对象的字段分配为参数或局部变量。分配后,使用Initobj初始化它们。
答案 1 :(得分:0)
Struct
s不能有真正的无参数构造函数。它们有一个隐含的默认构造函数,相当于default(T)
。
似乎IL等效default(T)
是initobj
与Newobj不同,initobj不会调用构造函数方法。 Initobj用于初始化值类型,而newobj用于分配和初始化对象。