获取调用方法的父对象类型
本文关键字:对象 类型 调用 方法 获取 | 更新日期: 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 : B
但Configure
方法是在B
中实现的,DeclaringType
将被B
,而ReflectedType
将被A
)。
如果我没有误会你的意思,你正在寻找反射类型属性。(你想要"ParentObject"的类型,我想你不在乎该方法是否来自派生的基类)
invoke[i].ReflectedType
如前所述,声明类型是有区别的。 这将为您提供真正实现该方法的类型。这可能是一些基类。因此,请务必检查您真正需要哪一个。