C# 如何使用预加载的MethodInfo局部变量发出方法?

C# 如何使用预加载的MethodInfo局部变量发出方法?,c#,.net,reflection.emit,C#,.net,Reflection.emit,我想发出一个有变量的方法,我可以这样做。但是,我想在该变量中存储一个MethodInfo对象,它是对不同(未发出)方法的引用 我可以发出操作码来调用typeof(someClass).GetMethod(…),但是如果我可以简单地为这个MethodInfo加载一个令牌并将其直接烘焙到变量中,效率会更高 因此,换言之,我试图找出它可能发出的原因,比如说一个“load object”操作码,并在发出时将一个对象传递给它,该对象将在运行时加载到堆栈上。(我尝试此操作时,OpCodes.Ldobj给出了

我想发出一个有变量的方法,我可以这样做。但是,我想在该变量中存储一个MethodInfo对象,它是对不同(未发出)方法的引用

我可以发出操作码来调用typeof(someClass).GetMethod(…),但是如果我可以简单地为这个MethodInfo加载一个令牌并将其直接烘焙到变量中,效率会更高


因此,换言之,我试图找出它可能发出的原因,比如说一个“load object”操作码,并在发出时将一个对象传递给它,该对象将在运行时加载到堆栈上。(我尝试此操作时,OpCodes.Ldobj给出了某种错误)。或者,我是否被迫发出在运行时执行此操作的操作码

您不能只在IL中加载任何常规对象,因为无法将其存储在IL中(某些特殊类型除外,如
string
)。您可以使用序列化(对于支持序列化的类型)来解决这个问题,但我认为这不是您想要的。而且,它有着完全不同的用途

但是你可以对
MethodInfo
这样做,就像C对
typeof
操作符所做的那样。这意味着:

  • 使用指令获取
  • 调用以获取
    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());
    
    MethodInfo-loadedMethod=…;
    var getMethodMethod=typeof(MethodBase).GetMethod(
    “GetMethodFromHandle”,新[]{typeof(RuntimeMethodHandle)});
    var createdMethod=新的DynamicMethod(
    “GetMethodInfo”,typeof(MethodInfo),Type.EmptyTypes);
    var il=createdMethod.GetILGenerator();
    il.Emit(opcode.Ldtoken,loadedMethod);
    Emit(opcode.Call,getMethodMethod);
    il.Emit(opcode.Castclass,typeof(MethodInfo));
    发射(操作码Ret);
    var func=(func)createdMethod.CreateDelegate(typeof(func));
    Console.WriteLine(func());
    
    我认为这是可能的。Eric Lippert曾在博客中提到一个可能的infoof C#操作符将使用此功能。您能否提供一点背景说明背后的原因,以便让我/我们更清楚地了解这个问题?@usr是关于
    infoof
    的语法问题,而不是如何实现它。