如何发出没有构造函数的新结构

时间:2012-03-26 21:06:07

标签: reflection struct reflection.emit

我尝试发出动态方法,通过某些值设置类的字段,当常规字段的类型为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 ) )行失败

有人能通过默认构造函数告诉我如何发布新的结构吗?

2 个答案:

答案 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用于分配和初始化对象。