【发布时间】:2012-09-02 00:43:22
【问题描述】:
给定一个识别非泛型类的开放泛型方法的 MethodInfo 实例,考虑以下伪代码:
class Foo { void FooMethod<T>() {} }
public static void PrintMethodInfo(RuntimeMethodHandle methodHandle)
{
var mi = (MethodInfo) MethodBase.GetMethodFromHandle(methodHandle);
Console.WriteLine("Method: "+mi.ToString());
}
var methodInfo = typeof(Foo).GetMethod("FooMethod");
在主体中生成包含此代码的方法“void GeneratedMethod
IL.Emit(OpCodes.Ldtoken, methodInfo);
IL.Emit(OpCodes.Call, methodInfoPrintMethodInfo);
调用 GeneratedMethod
Method: System.Object Method[Int32]()
在 .Net 4.0 上它将是:
Method: System.Object Method[T]()
因此,在 .Net 2.0/3.5 中,为 ldtoken 生成的 IL 将包含一个元数据令牌,该元数据令牌标识通用 FooMethod,该通用 FooMethod 使用调用 GeneratedMethod
然而,在 .Net 4.0 中,ldtoken 将包含标识开放泛型类型的元数据。
我很难找到支持 .Net 3.5 案例中发生的情况的文档(实际上,如果生成的方法本身不是通用的,它应该完全失败) - .Net 4 的行为似乎更合乎逻辑。我也找不到任何有关更改的文档。这是早期版本中的错误现已修复吗?
【问题讨论】:
-
“调用 GeneratedMethod 时给出的类型参数”是什么意思?你是说你生成的
GeneratedMethod是通用的,并且你用int作为类型参数来调用它? -
@svick 是的,没错。我进行了编辑,以便格式化程序不会吞下通用参数。
标签: .net reflection .net-4.0 reflection.emit