c# - C#发出对泛型方法的调用
问题描述
上课
class C
{
public T Get<T>()
{
return default;
}
public void M()
{
int i = this.Get<Int32>();
}
}
我想M
在运行时使用Reflection.Emit
and生成的主体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<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))
);
推荐阅读
- vba - 如何自定义功能区栏以打开表单
- java - 将可下载二进制文件合并为 Gradle 依赖项的正确方法是什么?
- go - 如何为具有公共部分的多个模型渲染模板
- ruby-on-rails - 如何在字符串中查找多个子字符串匹配项,更改子字符串附件
- swift - 如何从 SCNNode 父节点中删除或取消子节点?
- r - 用上述值填充分类变量中的 NA 值,同时保持 R 中的其他行值
- bash - 2 个 cronjobs 中的 1 个未在 Ubuntu 16.04 for windows 中运行 - 由于 cron 中的“日期”扩展
- c - 如何在 C 中剪切字符串?
- python - 如何在 matplotlib/basemap 中的多个 x,y 点之间绘制线
- java - 如何在 Android Studio 中使用 for 循环使大量图像视图可见?