将操作码设置字段设置为值

时间:2011-07-03 18:41:01

标签: .net reflection.emit

我正在尝试动态创建代理,所以我很满意Emit。 因此,当我使用emit设置我的字段时,我还需要将isDirty字段boolan设置为true。

我该怎么做?

Property Customer
{
  set
  {
    this.customerName = value;
    this.isDirty = true;
  }
}

发出代码:

 FieldBuilder isDirtyField = myTypeBuilder.DefineField("isDirty", typeof(bool), FieldAttributes.Private);                                                              

// Define the "set" accessor method for CustomerName.
            MethodBuilder custNameSetPropMthdBldr =
                myTypeBuilder.DefineMethod("set_CustomerName",
                                           getSetAttr,
                                           null,
                                           new Type[] { typeof(string) });

        ILGenerator custNameSetIL = custNameSetPropMthdBldr.GetILGenerator();

        custNameSetIL.Emit(OpCodes.Ldarg_0);
        custNameSetIL.Emit(OpCodes.Ldarg_1);
        custNameSetIL.Emit(OpCodes.Stfld, customerNameBldr);

        {
            custNameSetIL.EmitWriteLine("Start isDirty");
            ... do stuf here
            custNameSetIL.EmitWriteLine("End isDirty");

        }
        custNameSetIL.Emit(OpCodes.Ret);

此代码正常工作,只要我不尝试做isDirty字段,已经度过了周末,我试图在这个论坛中获得一些帮助。 THX

// dennis

1 个答案:

答案 0 :(得分:7)

我相信你想要的IL指令序列是

custNameSetIL.Emit(OpCodes.Ldarg_0);     // load this
custNameSetIL.Emit(OpCodes.Ldc_I4_1);            // load true (same as integer 1)
custNameSetIL.Emit(OpCodes.Stfld, isDirtyField); // store into isDirty