作者:HE-KILL-MY-EGO | 来源:互联网 | 2022-11-28 20:33
上课了
class C
{
public T Get()
{
return default;
}
public void M()
{
int i = this.Get();
}
}
我要生成的身体M
在运行时使用Reflection.Emit
,并ILGenerator
使其恰好类似于什么是如上图所示.
我尝试的是
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Call, typeof(C).GetMethod(nameof(C.Get), BindingFlags.Instance));
产量
ldarg.0
call instance !!0 C::Get(string)
// ^^
ret
但我需要得到
ldarg.0
call instance !!0 C::Get(string)
// ^^^^^
ret
(注意调用中的不同类型参数C.Get
)
当发出对通用cfunction的调用时,如何传递泛型参数的类型(即取消M0
并int32
反过来说)?
1> Luaan..:
您需要使用MakeGenericMethod替换类型参数:
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit
(
OpCodes.Call,
typeof(C)
.GetMethod(nameof(C.Get), BindingFlags.Instance)
.MakeGenericMethod(typeof(int))
);