我正在尝试生成动态方法。假设我arg在堆栈中有 bool 值。我想调用一个方法,该方法接受int将bool通过简单规则从该值转换的类型参数arg ? 1 : 0。对于一些示例代码,生成的 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--
Run Code Online (Sandbox Code Playgroud)
发射时OpCodes.Brtrue_S以及OpCodes.Br_S如何正确识别要跳转到的偏移量?
如果你真的只是想转换true到1和false到0,你可以使用一个事实,即类型大于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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
387 次 |
| 最近记录: |