C#reflection - 获取方法的整个参数列表(包括“this”的参数)

时间:2013-05-11 16:13:03

标签: c# reflection

我正在制作一个愚蠢的AOT .net编译器以获得乐趣,并遇到了一个问题。

我只是将程序集加载到内存中(我用C#编写)并且左右反射垃圾邮件以获取我需要的信息(例如方法体的CIL)。

This page说“我们需要对当前实例的引用(存储在本地参数索引0中)[...]”。但是,当我调用MethodInfo.GetParameters()时,不会返回此参数。

我正在将Ldarg等操作码中的字段解析为ParameterInfo对象,而不是原始索引,因此当“Ldarg.0”在实例方法中时,它会变得非常混乱 - 因为arg 0不在GetParameters

我的主要问题:是否有某种方法可以为ParameterInfo对象(参数索引0)获取this对象的实例,或者我是否只需要使用原始索引? (我真的不想使用int索引......)

这是一些代码,因为代码很好。 (包含在课程内)

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()
{
}

1 个答案:

答案 0 :(得分:2)

你没有获得ParameterInfo。简单地说:如果它是一个实例方法,则会有一个“this”映射到方法声明类型的arg-0。除了类型之外,它没有名称和任何有趣的属性。所有其他参数都偏移一个。对于静态方法,情况并非如此。请注意,这对于值类型的实例方法来说更有趣,因为它是一个by-ref参数。