一般的なオブジェクトをILに格納する方法がないため、一般的なオブジェクトをILにロードすることはできません(のようないくつかの特殊なタイプを除くstring)。シリアル化を使用して(それをサポートするタイプの場合)それを回避することはできますが、それはあなたが望んでいることではないと思います。また、ldobjまったく異なる目的を果たします。
ただし、これは、C#がオペレーターMethodInfoに対して行うのと非常によく似た方法で行うことができます。typeofつまり、次のことを意味します。
ldtoken命令を使用してRuntimeMethodHandle
MethodBase.GetMethodFromHandle()取得するために呼び出すMethodBase
- にキャスト
MethodInfo
を返すメソッドを生成するコード全体は、次のMethodInfoようになります。
MethodInfo loadedMethod = …;
var getMethodMethod = typeof(MethodBase).GetMethod(
"GetMethodFromHandle", new[] { typeof(RuntimeMethodHandle) });
var createdMethod = new DynamicMethod(
"GetMethodInfo", typeof(MethodInfo), Type.EmptyTypes);
var il = createdMethod.GetILGenerator();
il.Emit(OpCodes.Ldtoken, loadedMethod);
il.Emit(OpCodes.Call, getMethodMethod);
il.Emit(OpCodes.Castclass, typeof(MethodInfo));
il.Emit(OpCodes.Ret);
var func = (Func<MethodInfo>)createdMethod.CreateDelegate(typeof(Func<MethodInfo>));
Console.WriteLine(func());