Windows应用商店.NET GetCurrentMethod()。DeclaringType alternative

时间:2016-11-23 07:16:15

标签: c# .net windows-store

完全坚持这个...我有这个问题,我们在Unity项目中使用log4Net来构建Windows商店应用程序。 log4Net需要声明记录器的类类型或名称(作为字符串)。由于Windows商店.NET被修改,它没有像GetCurrentMethod()这样的常用方法......我查了一下,到目前为止它是没有希望的:

通常的方法就是这个

public sealed class SomeClassController : ApiController
{
    private static readonly ILog Log = 
        LoggerManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
...

How to get method name win 8 app - 这里提供的解决方案不起作用,因为属性[CallerMememberName]返回调用者(而不是声明者)。 func(表达式表达式)方法不起作用,因为它只在方法中使用时才有效,但不能作为类字段(在log4Net中就是这种情况)。

另一种可能性是使用StackFrame,但幸运的是" Windows商店也不支持它,进入StackTrace的唯一方法是通过异常,这不是一个选项,因为1.真的很慢2.所有异常抛出都必须在Unity生产中删除。

像GetType()这样的简单解决方案不起作用,因为如果有继承的类,它们会被覆盖。更多信息 - http://rundevrun.blogspot.lt/2012/11/gettype-vs-methodbasegetcurrentmethodde.html

我的选项用完了,在类字段中使用时是否无法获取DeclaringType ???

1 个答案:

答案 0 :(得分:1)

只需使用typeof - 它更简单,并且不需要任何框架支持:

public sealed class SomeClassController : ApiController
{
    private static readonly ILog Log = 
        LoggerManager.GetLogger(typeof(SomeClassController));
    ...
}

唯一的缺点是,如果您将其复制并粘贴到其他地方,您将最终使用错误的类进行日志记录。您可以通过以下方式缓解这一点:

  • 编写Roslyn代码分析器(或类似代码)以发现问题
  • 在代码审核中小心
  • 预先发布一个"预先发送LoggerManager.GetLogger的所有来电并查看它们"