我是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?
答案 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的类。