C# 发出检查布尔字段并中断到标签
我想检查一个布尔字段是否为假。但我无法让它发挥作用。
所以我想将一个 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);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
当您访问一个字段时,您需要先将
this
压入堆栈来正确引用它:When you access a field you need to reference it correctly by pushing
this
onto the stack first:因为你的 bool 没有初始化?
“如果对象为 null 并且字段不是静态的,则抛出 NullReferenceException”(请参阅 msdn)
Because your bool is not initialized?
"NullReferenceException is thrown if the object is null and the field is not static" (see msdn)