我知道编写自定义属性来装饰方法并在方法执行之前得到评估,但有没有办法对其进行修改,以便在执行该方法之后对属性进行评估?可能创建一个在之后而不是之前被评估的属性?
理论上(伪代码):
public void MyMethod()
{
Console.WriteLine("Hello World");
}
[AttributeToExecuteAfter]
我是否滥用属性的概念?如果有技术上的原因,这是不可能的,那是什么?
我知道编写自定义属性来装饰方法并在方法执行之前得到评估,但有没有办法对其进行修改,以便在执行该方法之后对属性进行评估?可能创建一个在之后而不是之前被评估的属性?
理论上(伪代码):
public void MyMethod()
{
Console.WriteLine("Hello World");
}
[AttributeToExecuteAfter]
我是否滥用属性的概念?如果有技术上的原因,这是不可能的,那是什么?
您是否指.net MVC中的ActionFilters?
如果是的话,可以通过扩展抽象ActionFilterAttribute类来覆盖OnActionExecuted方法。但这些仅适用于mvc操作方法。
我认为你是误解,是的。属性不是在您的方法运行之前或之后运行的代码。属性是附加到方法(或类等)的一段元数据。使用反射,可以编写代码来读取元数据。
这是我能想到的最好的例子:
业务对象框架我用有DataPortal的概念。在n层环境中,DataPortal位于服务器上并执行业务对象的CRUD方法。 DataPortal是这样编写的,在调用我的任何一个CRUD方法之前,它首先查看该方法是否具有RunMeInATransaction
属性。如果有,它创建一个事务,运行该方法,然后提交事务。从概念上讲,这很像有方法的属性;我的方法可以有RunMeInATransaction
属性。
正如Ken所说,属性只是元数据附加到方法/属性/字段/类,对“标记”元素有用,然后能够使用反射将其识别为代码。
即,在Linq2Sql中使用属性作为映射类与数据库表的一种方式。
您的误解可能来自于C#编译器实际使用某些特殊属性来执行具体操作的事实。但是这种功能对我们来说是不可用的,人类开发者:)
使用PostSharp您可以创建用于输入和退出装饰方法的自定义处理程序。