【问题标题】:Using attributes to run Actions使用属性运行操作
【发布时间】:2011-11-16 21:33:14
【问题描述】:

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

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

我的方法内容都在 LogExceptions 的操作中。我这样做了,所以我不必在整个节目中进行很多尝试,接球和投掷。它完全按照我的意愿工作,但作为一个懒惰的人,我不想一直写出 LogExceptions 调用并将我的逻辑嵌套在其中。

我想要做的就是将该逻辑拉到一个属性中,所以我需要做的就是:

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

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

非常感谢。

【问题讨论】:

    标签: c# .net-4.0


    【解决方案1】:

    查看面向方面的编程 (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;
        }
    }
    

    瞧,这使您的方法更具可读性,因为它不会被记录代码弄得杂乱无章,这不会给方法的实际功能添加任何内容(添加两个数字)。这会产生更具可读性和可维护性的代码。

    不久前,我在博客上写了一篇关于它的文章。在这里复制很长,但它演示了如何构建此类属性并替换常见代码,例如日志记录、异常处理......等。通过属性,这样你就不会用这种代码弄乱你的所有方法:

    https://github.com/geersch/PostSharp

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2017-10-30
        • 1970-01-01
        • 2011-05-27
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2012-12-04
        • 2022-07-25
        • 1970-01-01
        相关资源
        最近更新 更多