非ジェネリッククラスのオープンジェネリックメソッドを識別する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");
このコードを本文に含むメソッド「voidGeneratedMethod<T>()」を生成します。
IL.Emit(OpCodes.Ldtoken, methodInfo);
IL.Emit(OpCodes.Call, methodInfoPrintMethodInfo);
GeneratedMethod <int>()を呼び出すと、.Net3.5での出力は次のようになります。
Method: System.Object Method[Int32]()
.Net 4.0を使用している間は、次のようになります。
Method: System.Object Method[T]()
したがって、.Net 2.0 / 3.5では、ldtokenに対して生成されたILには、GeneratedMethod<T>が呼び出されたときに指定されたtype引数でインスタンス化された汎用FooMethod<>を識別するメタデータトークンが含まれるようです。
ただし、.Net 4.0では、ldtokenにはオープンジェネリック型を識別するメタデータが含まれます。
.Net 3.5の場合に起こっていることをサポートするドキュメントを見つけるのに問題があります(実際、生成されたメソッド自体が汎用でない場合は完全に失敗するはずです)-.Net4の動作はより論理的です。変更のドキュメントも見つかりません。これは、現在修正されている以前のバージョンのバグですか?