我正在尝试动态创建代理,因此我在使用Emit。所以当我使用emit设置我的字段时,我还需要将isDirty字段布尔值设置为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字段。我花了整个周末来解决这个问题,现在在论坛上寻求帮助。谢谢。
// Dennis
this.isDirty = true;
的代码。在IL中也是一样的:因为你正在设置一个实例属性,所以需要指示你正在操作哪个实例。当设置字段时,Stfld
操作数将从堆栈中弹出实例和值,因此你不会在堆栈上保留你的this
实例。 - kvb