使用属性运行Actions

时间:2011-09-14 10:19:29

标签: c# .net-4.0

我目前有一个动作,我对类中的每个方法执行如下操作:

public void DoSomething(object thing)
    {
        LogHelper.LogExceptions(() =>
        {
            //DoSomethingWithThing
        });
    }

我的方法内容都在LogExceptions的操作中。我做到了这一点,所以我不需要在整个节目中进行大量尝试,捕获和抛出。它完全按照我的意愿工作,但作为我的懒人,我不想继续写出LogExceptions调用并将逻辑嵌套在其中。

我想要做的是将该逻辑提升为一个属性,所以我需要做的就是:

    [LogExceptions()]
    public void DoSomething(object thing)
    {
         //DoSomethingWithThing
    }

首先,这是可能的,其次,是否有人知道我可以使用的任何参考资料?

非常感谢。

2 个答案:

答案 0 :(得分:2)

查看面向方面编程(AOP)框架,例如PostSharp。 PostSharp允许您创建可用于装饰类,方法等的属性。

可以对这样的属性(或方面)进行编程,以便在方法执行之前和完成之后注入代码。

例如,使用属性记录:

http://www.sharpcrafters.com/solutions/logging

为了完整,我将包括一个小例子。假设我们想在每次执行方法时记录一条消息。您可以为此目的创建一个方面(PostSharp属性)。

[Serializable]
public class LogAttribute : OnMethodBoundaryAspect
{
    public override void OnExit(MethodExecutionArgs args)
    {
        base.OnExit(args);

        Console.WriteLine(String.Format("{0}.{1}: {2}",
            args.Method.DeclaringType.Name,
            args.Method.Name,
            args.ReturnValue));
    }
}

此方面在方法完成时向控制台窗口写入消息。

现在您可以将此属性应用于方法。

public class Calculator
{
    [Log]
    public int Add(int x, int y)
    {
        return x + y;
    }
}

Voila,这使得您的方法更具可读性,因为它不会被记录代码混乱,这些代码不会增加方法的实际功能(添加两个数字)。这样可以获得更易读和可维护的代码。

前段时间我在博客上写了一篇关于它的文章。在这里复制它是相当长的,但它演示了如何构建这些属性并替换常用代码,如日志记录,异常处理等。通过属性,这样您就不会使用这种代码混淆所有方法:

http://cgeers.com/2011/05/08/postsharp/

答案 1 :(得分:1)

考虑使用面向方面的框架,例如PostSharp,可以代表您进行重写。来自PostSharp博客的This post似乎正是您所寻找的。