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

Ken*_*Ken 5 c# decorator static-members

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

public class Foo {
    private static readonly ILog log = LogManager.GetLogger(typeof(Foo));
    ....
}
Run Code Online (Sandbox Code Playgroud)

一个缺点是,这意味着我们将这个10字的部分粘贴在一起,并且偶尔会有人忘记更改类名.该log4net的常见问题也提到了这个另一种可能性,这更加详细:

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

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

[LogMe]  // or perhaps: [LogMe("log")]
public class Foo {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

Iga*_*nik 5

这正是AOP的一项任务 - 面向方面编程.看看PostSharp,它是一个.NET AOP框架,它可以让你完全按照自己的意愿行事.

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

编辑: PostSharp现在似乎是一个商业产品.如果您正在寻找开源(免费)解决方案,我建议使用LinFu AOP.


ros*_*dia 0

伙计,这在Python中是轻而易举的事情。我会研究C# 属性。