2011-07-29 36 views
1

我想檢查一個布爾字段,如果它是假的。但我無法讓它工作。c#發出檢查布爾字段並打破標籤

所以我想推一個布爾字段到堆棧並調用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); 

回答

2

當您訪問,你需要通過推動this到堆棧中第一個正確引用它的字段:

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

THX,它的工作。 –

0

因爲你BOOL未初始化? (見msdn

「如果對象爲null並且字段是不是靜態引發NullReferenceException」