我目前有一个动作,我对类中的每个方法执行如下操作:
public void DoSomething(object thing)
{
LogHelper.LogExceptions(() =>
{
//DoSomethingWithThing
});
}
我的方法内容都在LogExceptions的操作中。我做到了这一点,所以我不需要在整个节目中进行大量尝试,捕获和抛出。它完全按照我的意愿工作,但作为我的懒人,我不想继续写出LogExceptions调用并将逻辑嵌套在其中。
我想要做的是将该逻辑提升为一个属性,所以我需要做的就是:
[LogExceptions()]
public void DoSomething(object thing)
{
//DoSomethingWithThing
}
首先,这是可能的,其次,是否有人知道我可以使用的任何参考资料?
非常感谢。
答案 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,这使得您的方法更具可读性,因为它不会被记录代码混乱,这些代码不会增加方法的实际功能(添加两个数字)。这样可以获得更易读和可维护的代码。
前段时间我在博客上写了一篇关于它的文章。在这里复制它是相当长的,但它演示了如何构建这些属性并替换常用代码,如日志记录,异常处理等。通过属性,这样您就不会使用这种代码混淆所有方法:
答案 1 :(得分:1)