给定一个识别非泛型类的开放泛型方法的 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<T>()”:
IL.Emit(OpCodes.Ldtoken, methodInfo);
IL.Emit(OpCodes.Call, methodInfoPrintMethodInfo);
调用 GeneratedMethod<int>(),.Net 3.5 上的输出将是:
Method: System.Object Method[Int32]()
在 .Net 4.0 上,它将是:
Method: System.Object Method[T]()
因此,在 .Net 2.0/3.5 中,为 ldtoken 生成的 IL 将包含一个元数据令牌,该元数据令牌标识通用 FooMethod<>,该通用 FooMethod<> 使用调用 GeneratedMethod<T> 时给出的类型参数进行实例化。
然而,在 .Net 4.0 中,ldtoken 将包含标识开放泛型类型的元数据。
我很难找到支持 .Net 3.5 案例中发生的事情的文档(实际上,如果生成的方法本身不是通用的,它应该完全失败) - .Net 4 的行为似乎更合乎逻辑。我也找不到任何有关更改的文档。这是现在已经修复的早期版本中的错误吗?