鑑於識別非通用類的開放通用方法的MethodInfo實例,考慮下面的僞代碼:更改.Net 4中泛型方法的LdToken的行爲?
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");
生成方法「空隙GeneratedMethod <Ť>()」含有在體內驗證碼
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 <元數據標記>使用實例化的在調用GeneratedMethod <T>時給出的類型參數。
但是,在.Net 4.0中,ldtoken將包含標識開放泛型類型的元數據。
我很難找到支持.Net 3.5情況下發生的事情的文檔(事實上,如果生成的方法本身不是通用的,它應該完全失敗).Net 4行爲似乎更符合邏輯。我找不到任何有關更改的文檔。這是現在已經修復的早期版本中的錯誤嗎?
你是什麼意思,「GeneratedMethod被調用時給出的類型參數」?你是否說你正在生成的'GeneratedMethod'是泛型的,並且你用'int'作爲類型參數來調用它? – svick
@svick是的,這是正確的。我編輯過,以便格式化程序不會吞下通用參數。 –