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

标签 c# reflection

我为了好玩而制作了一个愚蠢的 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/

相关文章:

java - 如何查找java bean中包含的所有成员变量的字段

c# - 在运行时将所有事件处理程序从一个控件复制到另一个控件

c# - Facebook C# SDK - 重定向到另一个页面时出现问题

c# - C#中的控制台路径是什么?

c# - 如何获取通用列表中的最后一个对象?

c# - 禁用/启用表单时 ToolStripButton 仍然突出显示

c# - 静态事件未在不同的 dll 中订阅

java - 从包中获取所有类

c# - 在构造函数之前设置字段或属性值

java - Android - 无法访问 **package android.telephony** 下的某些类