在C#中获取属性上下文

时间:2009-08-20 19:03:39

标签: c# aop

基本上我正在尝试用C#实现某种穷人的面向方面编程。我曾考虑使用ContextAttribute但它们似乎只是在类级别绑定。有没有什么方法可以放置一个属性,以便它将接收与它注释的方法相同的参数或某种方式来访问它触发的上下文?

我有这段代码

public void AddUser(User user)
{
    var errors = DataAnnotationsValidationRunner.GetErrors(user);
    if (errors.Any())
           throw new RulesException(errors);
    users.Add(user);
}

我想从中提取前三行,所以我有类似

的东西
[Validated]
public void AddUser(User user)
{
   users.Add(user);
}

2 个答案:

答案 0 :(得分:2)

我认为你错过了第三个组件。大多数AOP实现(例如Aspect#)依赖于代理或拦截器来实际执行代码。在您的场景中,您缺少1)知道方法中存在属性所需的任何组件,以及2)触发在属性中执行代码所需的机制(或成为它)。

幸运的是,开源中已经有很多(相当)简单的解决方案。我能想到的最简单的选择是使用像PostSharp这样的编译时编织器。获取一份副本,在样本中你会找到几个你正在尝试做的事情的例子(你会对OnMethodInvocationAspect感兴趣)。

最终结果是您的代码看起来与您提供的示例中的代码完全一样,但它也运行您希望的代码。

答案 1 :(得分:1)

不确切地知道您的解决方案应该是什么样子,但是在C#属性中,只要您不请求它们,就不会执行代码(据我所知)。如果您查询属性,您还有上下文。所以我认为你的策略有问题。