.Net库可以在运行时识别调用类吗?

时间:2012-05-28 14:08:27

标签: c# .net

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

我过去使用的方法(在Win32应用程序中)是提供一个注册函数,库的用户可以调用它来列出使用该库的类。这有效,但是很痛苦且容易出错。鉴于我现在在.NET工作,我希望我能在运行时以某种方式获取这些类的列表,这样我就可以填充GUI而无需注册。

有没有办法实现这个目标?

4 个答案:

答案 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 - 简单。将所需信息作为参数添加到被调用方法中,对其进行注释,编译器完成剩下的工作。

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)

SADLY没有班级名字;)所以,运气不好。

否则 - 没有快速可靠的方式,抱歉。

  

在逐个类的基础上启用/禁用日志记录。

我所做的是有一个通用记录器FOR A类(Logger)。这是错误的开放,但它也允许我为另一个类记录一些东西 - 例如帮助方法中的例子 - 手动。关于它的好处和QUITE标准(nlog有类似的机制)。