.Net 库是否可以在运行时标识调用类

本文关键字:运行时 标识 调用 是否 Net | 更新日期: 2023-09-27 18:35:36

我有一个日志记录库,它提供了一个GUI,允许最终用户逐个类地启用/禁用日志记录。这允许支持人员让最终用户启用对解决问题感兴趣的类的登录,而不会用我们不关心的垃圾淹没日志(还有更多,但对于这个问题的目的来说应该足够了)。GUI 必须列出使用日志记录库的所有类。

我过去(在 Win32 应用程序中)使用的方法是提供一个注册函数,库的用户将调用该函数来列出使用该库的类。这有效,但很痛苦且容易出错。鉴于我现在正在使用 .NET,我希望我可以在运行时以某种方式自己获取这些类的列表,以便我可以在不需要注册的情况下填充 GUI。

有没有办法做到这一点?

.Net 库是否可以在运行时标识调用类

当我们记录时,每个想要记录的类都会为其类型创建一个记录器的静态实例。 通过此方法,您可以在创建每个实例时对其进行跟踪,并允许用户根据需要禁用日志。

private static readonly ILog LOG = LogManager.GetLog(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

但是,在加载类的静态成员之前,这自然不会被触发(我认为当类/类型首次访问时),所以我想您可能不会看到想要记录的类的完整列表,直到它们全部被访问。

您可以创建一个新的 StackTrace(这不仅用于异常报告),但它不是很快......

是的,您可以使用反射。以下代码列出当前加载的所有类(和结构):

foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()
   foreach(Type type in asm.GetTypes()){   
   } 
}

AppDomain.CurrentDomain.GetAssemblies() 将列出应用程序域中加载的所有程序集,然后使用 GetTypes() 列出程序集包含的所有类和结构。

4.5 - 简单。将所需信息作为参数添加到调用的方法中,对其进行注释,编译器完成其余的工作。

http://www.wintellect.com/cs/blogs/jgarland/archive/2012/03/05/using-the-new-callerinfo-attributes-for-reliable-property-change-notifications.aspx 有更多信息。

看起来像这样: private void OnPropertyChanged([CallerMemberName] String caller = null)

可悲的是没有类名;)所以,运气不好也在那里。

否则 - 没有快速可靠的方法,对不起。

以逐个类启用/禁用日志记录。

我所做的是有一个通用的记录器FOR A类(记录器)。这是对错误的开放,但它也允许我手动为另一个类记录一些东西 - 在辅助方法中的 exampüle。大约和它一样好,相当标准(nlog也有类似的机制)。