我有一个日志库,它提供了一个GUI,允许最终用户在逐个类的基础上启用/禁用日志记录。这允许支持人员让最终用户启用登录感兴趣的类来解决问题,而不会使用我们不关心的垃圾淹没日志(这里有更多内容,但它应该足以满足此问题的目的) 。 GUI必须列出使用日志库的所有类。
我过去使用的方法(在Win32应用程序中)是提供一个注册函数,库的用户可以调用它来列出使用该库的类。这有效,但是很痛苦且容易出错。鉴于我现在在.NET工作,我希望我能在运行时以某种方式获取这些类的列表,这样我就可以填充GUI而无需注册。
有没有办法实现这个目标?
答案 0 :(得分:1)
当我们记录时,每个想要记录的类都会为其类型创建一个记录器的静态实例。通过此方法,您可以在创建时跟踪每个实例,并允许用户根据需要禁用日志。
private static readonly ILog LOG = LogManager.GetLog(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
然而,在加载类的静态成员之前,这自然不会被触发(我认为首次访问类/类型时),所以我认为你看不到完整的类列表是合理的。他们想要记录,直到他们全部被访问。
答案 1 :(得分:0)
您可以创建一个新的StackTrace(这不仅适用于异常报告),但速度不是很快......
答案 2 :(得分:0)
是的,您可以使用reflection。以下代码列出了当前加载的所有类(和结构):
foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()
foreach(Type type in asm.GetTypes()){
}
}
AppDomain.CurrentDomain.GetAssemblies()将列出应用程序域中加载的所有程序集,然后使用GetTypes()列出程序集所包含的所有类和结构。
答案 3 :(得分:0)
4.5 - 简单。将所需信息作为参数添加到被调用方法中,对其进行注释,编译器完成剩下的工作。
看起来像这样:private void OnPropertyChanged([CallerMemberName] String caller = null)
SADLY没有班级名字;)所以,运气不好。
否则 - 没有快速可靠的方式,抱歉。
在逐个类的基础上启用/禁用日志记录。
我所做的是有一个通用记录器FOR A类(Logger)。这是错误的开放,但它也允许我为另一个类记录一些东西 - 例如帮助方法中的例子 - 手动。关于它的好处和QUITE标准(nlog有类似的机制)。