我正在做一个愚蠢的AOT .net编译器,为了好玩,然后遇到了一个问题。
我只是将程序集加载到内存中(我用c#编写),并向左右发送反射以获得我需要的信息(例如方法体的CIL)。
这个页面说"我们需要对当前实例的引用(存储在本地参数索引0中)[…]"。然而,当我调用MethodInfo.GetParameters()
时,这个参数没有返回。
我正在解析操作码中的字段,如Ldarg
到ParameterInfo对象,而不是原始索引,所以当"Ldarg.0"在实例方法内时,它会变得非常混乱-因为arg 0不在GetParameters
中!
我的主要问题:是否有某种方式我可以获得this
对象(参数索引0)的ParameterInfo
对象的实例,或者我必须只使用原始索引?(我真的不想使用int索引…)
这里有一些代码,因为代码是好的。(包含在类Program中)
static void Main(string[] args)
{
// obviously throws an IndexOutOfRangeException instead of returning the (true) argument 0
Console.WriteLine(typeof (Program).GetMethod("Test").GetParameters()[0]);
}
public void Test()
{
}
你不会得到一个ParameterInfo。简单地说:如果它是一个实例方法,则有一个"this"映射到该方法声明类型的arg-0。除了类型之外,它没有名称,也没有其他有趣的属性。所有其他参数偏移1。对于静态方法,情况并非如此。请注意,对于值类型上的实例方法,它是一个by-ref参数,这会变得更加有趣。