获取调用方法的父对象类型

本文关键字:对象 类型 调用 方法 获取 | 更新日期: 2023-09-27 18:36:33

我正在调试一个不是我写的大型应用程序,它在Windows上运行,但在Linux+MONO上挂起。 该应用程序由一个 C# Core 组成,其中包含一个自制的 ~700 行 ScriptCompiler 类,该类在运行时编译更多 C# 脚本。

编译完所有"脚本"后,ScriptCompiler 遍历所有程序集并查找要调用的 Configure() 方法。 其中一个配置方法在使用 Mono 的 Linux 系统上运行时挂起。 下面是一个相关的片段:

for (int i = 0; i < types.Length; ++i)
    {
        MethodInfo m = types[i].GetMethod(method, BindingFlags.Static  | BindingFlags.Public);
        if (m != null)
        {
            invoke.Add(m);
        }
    }

紧随其后的是

invoke.Sort(new CallPriorityComparer());
for (int i = 0; i < invoke.Count; ++i)
{
    invoke[i].Invoke(null, null);
}

这是一个巨大的应用程序,所以我不能随意进行更改。 我想做的是在该循环中插入一行,该行吐出其配置方法当前正在被调用到 stdout 的对象的名称(或类型,我猜)。 像这样:

invoke[i].ParentObject.GetType();

(显然这是无效的,但希望这能表达我的观点)。

这可能吗?

获取调用方法的父对象类型

您可以获取声明 invoke[i] 引用的方法的类型的名称:

invoke[i].DeclaringType.Name

然后,您可以根据需要将其注销。

正如 CSharpie 所指出的,这与ReflectedType不同 - 如果 Configure 方法派生自基类,DeclaringType将为您提供基类,而不一定是反映的实际运行时类型。

由于 Configure 方法可能由您迭代的每个类型显式实现(无论如何您这样做都是出于调试目的),因此在您的情况下使用哪一种方法可能不会产生太大区别。

不过,DeclaringType可能对您更有用,因为它会准确地告诉您在哪里可以找到实现(例如,如果您反映类A : BConfigure方法是在B中实现的,DeclaringType将被B,而ReflectedType将被A)。

如果我没有误会你的意思,你正在寻找反射类型属性。(你想要"ParentObject"的类型,我想你不在乎该方法是否来自派生的基类)

invoke[i].ReflectedType

如前所述,声明类型是有区别的。 这将为您提供真正实现该方法的类型。这可能是一些基类。因此,请务必检查您真正需要哪一个。