如何通过属性控制方法行为?

时间:2009-04-07 15:33:30

标签: c# .net attributes

我想将自定义属性应用于某些表明应将其作为事务处理的方法。一般来说,我知道如何通过继承System.Attribute来创建自定义属性,但我不知道如何做我需要的。

我的目标是这样的:

[TransactionalMethod()]
public void SaveData(object someObject)
{
    // ... maybe some processing here
    // ... then the object gets saved to a database
    someObject.Save();
}

TransactionalMethod()属性会使该方法的行为就像它被包装在TransactionScope中一样......

 try 
 {
     using(TransactionScope scope = new TransactionScope())
     {
         SaveData(someObject);
         scope.Complete();
     }
 }
 catch 
 {
     // handle the exception here
 }

如果SaveData()方法抛出异常,那么我们将不在“使用”范围内,并且不会调用scope.Complete。

我不想找到调用SaveData()的每个实例,并手动添加代码使用它周围的语句。我怎样才能创建导致此行为的属性?

2 个答案:

答案 0 :(得分:7)

基本上你想要Aspect-Oriented Programming(AOP)。

看看PostSharp - 它可以很好地处理这个问题。还有其他选择,但我没有使用它们。

答案 1 :(得分:4)

Aspect.NET是另一个服务于同一目的的项目