2009-09-30 64 views
0

我知道编写自定义属性来装饰方法并在方法执行之前得到评估,但有没有办法对其进行修改,以便在执行该方法之后对属性进行评估可能创建一个在之后而不是之前被评估的属性?

理论上(伪代码):

public void MyMethod() 
{ 
    Console.WriteLine("Hello World"); 
} 
[AttributeToExecuteAfter] 

我是否滥用属性的概念?如果有技术上的原因,这是不可能的,那是什么?

回答

1

您是否指.net MVC中的ActionFilters?

如果是的话,可以通过扩展抽象ActionFilterAttribute类来覆盖OnActionExecuted方法。但这些仅适用于mvc操作方法。

2

我认为你是误解,是的。属性不是在您的方法运行之前或之后运行的代码。属性是附加到方法(或类等)的一段元数据。使用反射,可以编写代码来读取元数据。

这是我能想到的最好的例子:

业务对象框架我用有DataPortal的概念。在n层环境中,DataPortal位于服务器上并执行业务对象的CRUD方法。 DataPortal是这样编写的,在调用我的任何一个CRUD方法之前,它首先查看该方法是否具有RunMeInATransaction属性。如果有,它创建一个事务,运行该方法,然后提交事务。从概念上讲,这很像有方法的属性;我的方法可以有RunMeInATransaction属性。

0

正如Ken所说,属性只是元数据附加到方法/属性/字段/类,对“标记”元素有用,然后能够使用反射将其识别为代码。

即,在Linq2Sql中使用属性作为映射类与数据库表的一种方式。

您的误解可能来自于C#编译器实际使用某些特殊属性来执行具体操作的事实。但是这种功能对我们来说是不可用的,人类开发者:)

1

使用PostSharp您可以创建用于输入和退出装饰方法的自定义处理程序。

相关问题