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

Get invoked method's parent object type?

我正在调试一个不是我编写的大型应用程序,它在 Windows 上运行但在 Linux+MONO 上挂起。该应用程序包含一个 C# 核心,其中包含一个约 700 行的 ScriptCompiler class,可在运行时编译更多 C# 脚本。

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

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);
}

这是一个庞大的应用程序,所以我不能随心所欲地进行更改。我想要做的是在该循环中插入一行,以吐出当前正在调用其 Configure 方法的对象的名称(或类型,我猜)到标准输出。类似于:

invoke[i].ParentObject.GetType();

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

这可能吗?

你可以得到invoke[i]引用的方法声明的类型名称:

invoke[i].DeclaringType.Name

然后您可以根据需要注销它。

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

由于 Configure 方法可能由您正在迭代的每种类型显式实现(无论如何您这样做是为了调试目的),它可能不会产生很大的不同你用的是哪一个。

DeclaringType 可能对您更有用,因为它会准确地告诉您在哪里可以找到实现(例如,如果您反映 class A : BConfigure 方法在 B 中实现,DeclaringType 将是 BReflectedType 将是 A).

如果我没有误会你的话,你正在寻找 ReflectedType-属性。 (你想要 "ParentObject" 的类型,据此我猜你不关心该方法是否来自派生基类)

invoke[i].ReflectedType

如前所述,DeclaringType 有所不同。这将为您提供真正实现该方法的类型。这可能是一些基类。 所以一定要检查你真正需要的是哪一个。