【问题标题】:generics with IL?IL泛型?
【发布时间】:2012-04-06 09:00:33
【问题描述】:

是否可以在 IL 生成器中使用泛型?

        DynamicMethod method = new DynamicMethod(
            "GetStuff", typeof(int), new Type[] { typeof(object) });

        ILGenerator il = method.GetILGenerator();

        ... etc

【问题讨论】:

  • 你的问题并不清楚:你是想创建一个泛型方法还是只在其中使用一些泛型类型(或方法)?
  • @svick:我想动态创建一个泛型方法。
  • @romkyns:我之前在挖掘 SO 材料时阅读了该问题和答案。我努力确保它不是重复的,但我有机会再次问这个问题,因为看起来该信息可能适用于以前版本的 .net。

标签: c# .net reflection.emit il ilgenerator


【解决方案1】:

是的,这是可能的,但不适用于 DynamicMethod 类。如果你被限制使用这个类,你就不走运了。如果您可以改用 MethodBuilder 对象,请继续阅读。

对于大多数意图和目的而言,发出泛型方法的主体与发出其他方法的主体没有什么不同,只是您可以创建泛型类型的局部变量。下面是一个使用带有泛型参数 T 的 MethodBuilder 创建泛型方法并创建 T 类型的局部方法的示例:

MethodBuilder method;
//... Leaving out code to create MethodBuilder and store in method
var genericParameters = method.DefineGenericParameters(new[] { "T" });
var il = method.GetILGenerator();
LocalBuilder genericLocal = il.DeclareLocal(genericParameters[0]);

要从另一个方法发出对该泛型方法的调用,请使用此代码。假设method 是一个描述泛型方法定义的MethodInfo 或MethodBuilder 对象,您可以使用单个泛型参数int 发出对该方法的调用,如下所示:

il.EmitCall(OpCodes.Call, method.MakeGenericMethod(typeof(int)), new[] { typeof(int) }));

【讨论】:

  • 您可以使用DefineGenericParameters()返回的数组,而不是调用GetGenericArguments()。
  • 谢谢,我不知道。现在已经修好了。
  • 谢谢@svick & aboveyouOO。我在 SO 上读到这是不可能的,并且想问一下——我希望该信息可能是针对以前版本的 .net
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多