2013-07-03 52 views
0

我正在嘗試生成動態方法。假設我的布爾值爲arg。我想調用一個方法來接受int類型的參數,該參數將通過簡單的規則arg ? 1 : 0bool值轉換而來。對於生成的IL代碼一些示例代碼低於:如何在IL代碼中發出三元運算符

//bool value is already pushed into stack 
IL_003d: brtrue.s IL_0042 
IL_003f: ldc.i4.0 
IL_0040: br.s  IL_0043 
IL_0042: ldc.i4.1 
IL_0043: callvirt --methodName-- 

當emmiting OpCodes.Brtrue_SOpCodes.Br_S我怎樣才能正確地識別偏移跳轉到?

回答

3

如果你真的只是想true轉換爲1false0,你可以使用一個事實,即類型大於4個字節較小擴展到堆棧上的4個字節。這意味着您不必執行任何操作,只需將bool作爲int即可。

如果你真的想要一個三元運算符,您可以用對方法DefineLabel()MarkLabel()

var trueLabel = il.DefineLabel(); 
var endLabel = il.DefineLabel(); 

il.Emit(OpCodes.Brtrue, trueLabel); 

il.Emit(OpCodes.Ldc_I4_0); 

il.Emit(OpCodes.Br, endLabel); 

il.MarkLabel(trueLabel); 

il.Emit(OpCodes.Ldc_I4_1); 

il.MarkLabel(endLabel);