获取调用方法的父对象类型?
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 : B
但Configure
方法在 B
中实现,DeclaringType
将是 B
而 ReflectedType
将是 A
).
如果我没有误会你的话,你正在寻找 ReflectedType-属性。 (你想要 "ParentObject" 的类型,据此我猜你不关心该方法是否来自派生基类)
invoke[i].ReflectedType
如前所述,DeclaringType 有所不同。这将为您提供真正实现该方法的类型。这可能是一些基类。
所以一定要检查你真正需要的是哪一个。
我正在调试一个不是我编写的大型应用程序,它在 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 : B
但Configure
方法在 B
中实现,DeclaringType
将是 B
而 ReflectedType
将是 A
).
如果我没有误会你的话,你正在寻找 ReflectedType-属性。 (你想要 "ParentObject" 的类型,据此我猜你不关心该方法是否来自派生基类)
invoke[i].ReflectedType
如前所述,DeclaringType 有所不同。这将为您提供真正实现该方法的类型。这可能是一些基类。 所以一定要检查你真正需要的是哪一个。