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

C#反射-获取方法的整个参数列表(包括“this”的参数),c#,reflection,C#,Reflection,为了好玩,我正在做一个愚蠢的AOT.net编译器,但遇到了一个问题 我只是将程序集加载到内存中(我正在用C#编写它),并左右垃圾发送反射以获取所需的信息(例如方法体的CIL) 表示“我们需要对当前实例的引用(存储在本地参数索引0中)[…]”。但是,当我调用MethodInfo.GetParameters()时,不会返回此参数 我正在将操作码(如Ldarg)中的字段解析为ParameterInfo对象,而不是原始索引,因此当“Ldarg.0”位于实例方法中时会非常混乱,因为arg 0不在GetPa

为了好玩,我正在做一个愚蠢的AOT.net编译器,但遇到了一个问题

我只是将程序集加载到内存中(我正在用C#编写它),并左右垃圾发送反射以获取所需的信息(例如方法体的CIL)

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

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

我的主要问题是:有什么方法可以为
这个
对象(参数索引0)获取
参数信息
对象的实例,还是只需要使用原始索引?(我真的不想使用int索引…)

这里有一些代码,因为代码很好。(包含在课程计划中)


你没有这方面的参数信息。简单地说:如果它是一个实例方法,那么有一个“this”映射到该方法声明类型的arg-0。除了它的类型之外,它没有名称,也没有其他有趣的属性。所有其他参数将偏移一个。对于静态方法,情况并非如此。请注意,对于值类型上的实例方法,如果它是一个by-ref参数,那么这就更有趣了。

所以我想我必须使用原始int索引,只需要一个“if-instance和arg0-then-load‘this’”?我很害怕,但我想这并不可怕。@khyperia我只是使用实用方法,根据是否有偏移量,它们的行为会有所不同。您可以使用null来表示“this”。感谢您的想法,我没有想到使用null。
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()
{
}