是否可以使用postsharp拦截通用列表中的添加/删除方法?

时间:2013-03-26 15:00:07

标签: c# validation aop postsharp

我是AOP的新手并且是锐意(2.1.0.0)。我一直在尝试使用属性/方法拦截,并且能够为我编写的类编写inteceptor方面。

我的目标是在编译之前没有包含任何逻辑的列表。

我想要实现的一个例子是:

public class Foo
{
    //Implementation should throw an exception if more than 1 string added.
    public List<string> MyList { get; set; }
}

我不确定的一件事是名单。我希望能够在列表上调用Add()或Remove()时运行一些验证。如果我将列表包装在我自己的自定义列表类中并使用aspect属性装饰类,我想我可以这样做。

我知道我可以使用自己的自定义列表完成此操作,并在我自己的添加/删除实现中做一些聪明的事情 - 但如果可能的话,这是我更愿意避免的。

是否还有其他(或更好的)拦截这些方法的方式 - 特别是使用post sharp?

2 个答案:

答案 0 :(得分:2)

无法以这种方式修改List<T>类,因为Add方法不是虚拟的。如果MyList属性改为返回IList<string>,则它返回的对象可以执行此类验证。

.NET框架提供了Collection<T>类来帮助您扩展某些列表功能。实现您描述的功能的最简单方法是从中派生一个类并在InsertItem中执行验证。

Collection<T>类实现IList<string>,因此您仍需要更改Foo.MyList的属性类型。

编辑AOP:如果您想对此功能使用AOP,而不是从用户操作的MyList返回列表,Foo类将提供{在更改后备列表之前执行必要验证的{1}}和Add方法。在这种情况下,我将从Remove属性返回ReadOnlyCollection<T>,以清楚地表明列表仅通过MyList中提供的方法进行操作。

答案 1 :(得分:1)

.NET中的通用List没有集合更改事件。我知道你不想听到这个,但你要么需要包装List,要么你需要创建一个实现IList的类。