我正在调试一个我没有编写的大型应用程序,它在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();
(显然这不是有效的,但希望能得到我的观点)。
这甚至可能吗?
答案 0 :(得分:2)
您可以获取invoke[i]
引用的方法声明类型的名称:
invoke[i].DeclaringType.Name
然后,您可以根据需要将其记录下来。
如CSharpie所述,这与ReflectedType
不同 - 如果Configure
方法是从基类派生的,DeclaringType
将为您提供基类,不一定是实际的反映的运行时类型。
由于Configure
方法很可能是由您正在迭代的每种类型明确实现的(并且您无论如何都是出于调试目的而这样做),因此它很可能不会成功。你在案件中使用哪一个。
DeclaringType
对您来说可能会更有用,因为它会准确地告诉您在哪里可以找到实现(例如,如果您反映的是课程A : B
,而是Configure
方法已在B
中实施,DeclaringType
将B
,而ReflectedType
将为A
。)
答案 1 :(得分:2)
如果我没有弄错你,你正在寻找ReflectedType - 财产。 (你想要&#34; ParentObject&#34的类型;我猜你不在乎这个方法是否来自派生的基类)
invoke[i].ReflectedType
如前所述,DeclaringType存在差异。这将为您提供真正实现该方法的类型。这可能是一些基础类。 因此,请务必检查您真正需要的那个。