ブールフィールドが偽であるかどうかをチェックしたいと思います。しかし、私はそれを働かせることはできません。c#emit 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);
Thxを(msdnを参照してください)「オブジェクトがnullで、フィールドが静的でない場合とNullReferenceExceptionがスローされます」。 –