gpt4 book ai didi

C# 发出对泛型方法的调用

转载 作者:行者123 更新时间:2023-11-30 13:53:44 24 4
gpt4 key购买 nike

上课

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

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

我想生成 M 的正文在运行时使用 Reflection.EmitILGenerator因此它与上面显示的完全相似。


我试过的是

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<T> 时的不同类型参数)


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

最佳答案

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

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

关于C# 发出对泛型方法的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53407360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com