c#emit检查一个bool字段并打破一个标签

时间:2011-07-29 21:36:40

标签: c# reflection.emit

我想检查一个bool字段,如果它是假的。但我无法让它发挥作用。

所以我想将一个bool字段推送到堆栈并调用Brtrue_S,这将转过来控制是一个值是true还是不为null。但它失败了。 如果我只将int(比如说0)推送到堆栈,这段代码工作正常,为什么不是布尔值?

我已经尝试了一些unbox_any,但我知道这一点,并不是那么好。

FieldBuilder fieldId = proxy.DefineField("Is" + property.Name + "Init", typeof (Boolean),
                                                                 FieldAttributes.Private);


Label ExitIfStatement = getIL.DefineLabel();
//getIL.Emit(OpCodes.Ldc_I4_0); // push 0 to the eval stack, this WORKS FINE!

//getIL.Emit(OpCodes.Ldfld, fieldId); // push 0 to the eval stack // THIS FAILD, WHY ? 

getIL.Emit(OpCodes.Brtrue_S, ExitIfStatement); // if is[propertyName]init == true goto MarkLabel(ExitIfStatement)
getIL.EmitWriteLine("Test if null is true");
getIL.Emit(OpCodes.Nop);

getIL.MarkLabel(ExitIfStatement);
getIL.EmitWriteLine("Test if null: false");                 
getIL.Emit(OpCodes.Nop);

getIL.Emit(OpCodes.Ldarg_0); // push the type on stack we need it to call base property
getIL.Emit(OpCodes.Call, propertyInfo.GetGetMethod()); // TEST CODE
getIL.Emit(OpCodes.Ret);

2 个答案:

答案 0 :(得分:2)

当您访问某个字段时,您需要先将this推入堆栈,然后才能正确引用它:

getIL.Emit(OpCodes.Ldarg_0);
getIL.Emit(OpCodes.Ldfld, fieldId);

答案 1 :(得分:0)

因为你的bool没有初始化?

“如果对象为null且字段不是静态的,则抛出NullReferenceException”(参见msdn