【问题标题】:C# emit call to generic methodC#发出对泛型方法的调用
【发布时间】:2018-11-21 07:46:02
【问题描述】:

上课

class C
{
    public T Get<T>()
    {
        return default;
    }

    public void M()
    {
        int i = this.Get<Int32>();
    }
}

我想在运行时使用Reflection.EmitILGenerator 生成M 的主体,使其与上面显示的内容完全相同。


我尝试的是

ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Call, typeof(C).GetMethod(nameof(C.Get), BindingFlags.Instance));

产生

ldarg.0
call instance !!0 C::Get<M0>(string)
//                       ^^
ret

但我需要得到

ldarg.0
call instance !!0 C::Get<int32>(string)
//                       ^^^^^
ret

(注意C.Get&lt;T&gt;调用中的不同类型参数)


发出对泛型 cfunction 的调用时,如何传递泛型参数的类型(即去掉 M0 并改为使用 int32)? p>

【问题讨论】:

    标签: c# generics cil reflection.emit


    【解决方案1】:

    您需要将类型参数替换为MakeGenericMethod

    ilGenerator.Emit(OpCodes.Ldarg_0);
    ilGenerator.Emit
    ( 
      OpCodes.Call, 
      typeof(C)
      .GetMethod(nameof(C.Get), BindingFlags.Instance)
      .MakeGenericMethod(typeof(int))
    );
    

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多