可以创建一个在之后而不是之前进行评估的属性吗?

时间:2009-09-30 21:46:36

标签: c# .net asp.net-mvc visual-studio-2008

我知道编写自定义属性来装饰方法并在方法执行之前进行评估,但有没有办法对其进行修改,以便在方法执行后评估属性?< / p>

理论上(伪代码):

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

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

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

您是指.net MVC中的ActionFilters吗?

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

即,Linq2Sql中使用属性作为使用数据库表映射类的方法。

您的误解可能是因为C#编译器实际上使用了一些特殊属性来执行具体操作。但是,我们这些人类开发人员无法使用这种功能:)