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