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