声明静态成员的类装饰器(例如,对于 log4net)?

2024-04-08

我正在使用 log4net,我们的代码中有很多这样的内容:

public class Foo {
    private static readonly ILog log = LogManager.GetLogger(typeof(Foo));
    ....
}

一个缺点是,这意味着我们要将这 10 个单词的部分粘贴到各处,并且时不时地有人会忘记更改类名称。这log4net常见问题解答 http://log4net.sourceforge.net/release/1.2.0.30316/doc/manual/faq.html还提到了这种替代可能性,它更加冗长:

public class Foo {
    private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    ...
}

是否可以编写一个装饰器来定义它?我真的很想简单地说:

[LogMe]  // or perhaps: [LogMe("log")]
public class Foo {
    ...
}

我在其他语言中做过类似的事情,但从未使用过像 C# 这样的静态编译语言。我可以从装饰器定义类成员吗?

Edit: 呵呵。我是一名 Lisp 程序员。我很欣赏切换语言的建议,但实际上,如果我要切换语言以获得更好的元编程功能,我会一直选择 Lisp,而不是半途而废。不幸的是,在这个项目中不能选择使用不同的语言。


这正是 AOP(面向方面​​编程)的任务。看一下后锐利 http://www.sharpcrafters.com/postsharp,它是一个.NET AOP 框架,它将允许您完全做您想做的事情。

这是通过在后编译中修改(或编织)IL 代码并将日志记录方面添加到修饰方法来实现的。

EDIT:看来PostSharp 现在已经是一个商业产品了。如果您正在寻找开源(免费)解决方案,我建议林富AOP http://www.codeproject.com/KB/cs/LinFuPart6.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

声明静态成员的类装饰器(例如,对于 log4net)? 的相关文章

随机推荐