一般的なオブジェクトを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());