C# 发出检查布尔字段并中断到标签

发布于 2024-11-26 22:57:06 字数 1101 浏览 2 评论 0 原文

我想检查一个布尔字段是否为假。但我无法让它发挥作用。

所以我想将一个 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);

I want to check a bool field if it is false. But I can not get it to work.

So I want to push a bool field to the stack and call the Brtrue_S, this will turn over control is a value is true or not null. But it fail.
This code is working fine if I only push a int, say a 0, to the stack, why not an boolean?

I have try some unbox_any, but my know how on this, is not that good.

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

走过海棠暮 2024-12-03 22:57:06

当您访问一个字段时,您需要先将 this 压入堆栈来正确引用它:

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

When you access a field you need to reference it correctly by pushing this onto the stack first:

getIL.Emit(OpCodes.Ldarg_0);
getIL.Emit(OpCodes.Ldfld, fieldId);
奢望 2024-12-03 22:57:06

因为你的 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)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文