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

时间:2015-01-07 17:53:30

标签: c# mono

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

在编译所有"脚本"之后,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);
}

这是一个巨大的应用程序,所以我不能毫不犹豫地进行更改。我想要做的是在该循环中插入一行,该行将吐出当前正在调用其配置方法的对象的名称(或类型,我猜)到stdout。类似的东西:

invoke[i].ParentObject.GetType();

(显然这不是有效的,但希望能得到我的观点)。

这甚至可能吗?

2 个答案:

答案 0 :(得分:2)

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

invoke[i].DeclaringType.Name

然后,您可以根据需要将其记录下来。

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

由于Configure方法很可能是由您正在迭代的每种类型明确实现的(并且您无论如何都是出于调试目的而这样做),因此它很可能不会成功。你在案件中使用哪一个。

DeclaringType对您来说可能会更有用,因为它会准确地告诉您在哪里可以找到实现(例如,如果您反映的是课程A : B,而是Configure方法已在B中实施,DeclaringTypeB,而ReflectedType将为A。)

答案 1 :(得分:2)

如果我没有弄错你,你正在寻找ReflectedType - 财产。 (你想要&#34; ParentObject&#34的类型;我猜你不在乎这个方法是否来自派生的基类)

invoke[i].ReflectedType

如前所述,DeclaringType存在差异。这将为您提供真正实现该方法的类型。这可能是一些基础类。 因此,请务必检查您真正需要的那个。