c#发出检查bool字段并将其转换为标签

本文关键字:转换 标签 字段 检查 bool | 更新日期: 2023-09-27 18:04:04

我想检查bool字段是否为假。但是我不能让它工作。

所以我想把一个bool字段推到堆栈上,并调用Brtrue_S,这将把控制权交给一个值是真还是不为空。但它失败了。如果我只把一个整型值,比如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);

c#发出检查bool字段并将其转换为标签

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

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

因为你的bool值没有初始化?

"如果对象为空且字段不是静态的,则抛出NullReferenceException "(参见msdn)