我为了好玩而制作了一个愚蠢的 AOT .net 编译器,但遇到了一个问题。
我只是将程序集加载到内存中(我用 C# 编写它)并左右发送垃圾反射以获取我需要的信息(例如方法主体的 CIL)。
This page说“我们需要对当前实例的引用(存储在本地参数索引 0 中)[...]”。但是,当我调用 MethodInfo.GetParameters()
时,不会返回此参数。
我正在将诸如 Ldarg
之类的操作码中的字段解析为 ParameterInfo 对象,而不是原始索引,因此当“Ldarg.0”在实例方法中时它会变得非常困惑 - 因为 arg 0不在 GetParameters
中!
我的主要问题:有什么方法可以为 this
对象(参数索引 0)获取 ParameterInfo
对象的实例,还是我必须只使用原始索引? (我真的不想用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()
{
}
最佳答案
您不会为此获得 ParameterInfo。简单地说:如果它是一个实例方法,则有一个“this”映射到方法声明类型的 arg-0。它没有名称,除了它的类型之外没有其他有趣的属性。所有其他参数都偏移一个。对于静态方法,情况并非如此。请注意,对于值类型上的实例方法,这是一个 by-ref 参数,这会变得更加有趣。
关于C# 反射 - 获取方法的整个参数列表(包括 "this"的参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16499188/