2011-07-29 10 views
1

ブールフィールドが偽であるかどうかをチェックしたいと思います。しかし、私はそれを働かせることはできません。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); 

答えて

2

あなたが最初のスタックにthisを押して、正しくそれを参照する必要がフィールドにアクセス:あなたのブール値が初期化されていないので

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

Thxを(msdnを参照してください)「オブジェクトがnullで、フィールドが静的でない場合とNullReferenceExceptionがスローされます」。 –

0

を?

は、それが働いて、

関連する問題