如果布尔字段为假,我想检查它。但是我不能让它工作。
所以我想把一个布尔域推送到堆栈,并调用Brtrue_S,这将会控制一个值是否为真或不为空。但它失败了。如果我只将一个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);发布于 2011-07-30 06:03:52
当您访问一个字段时,您需要通过首先将this推送到堆栈上来正确引用它:
getIL.Emit(OpCodes.Ldarg_0);
getIL.Emit(OpCodes.Ldfld, fieldId);发布于 2011-07-30 06:10:51
因为你的bool没有初始化?
“如果对象为空并且字段不是静态的,则抛出NullReferenceException”(参见msdn)
https://stackoverflow.com/questions/6879287
复制相似问题