是否有可能拦截添加/删除方法在一个通用列表使用后尖
本文关键字:一个 列表 有可能 添加 方法 删除 是否 | 更新日期: 2023-09-27 18:06:09
我是AOP的新手,post sharp(2.1.0.0)。我一直在尝试属性/方法拦截,并且能够为我编写的类编写侦听器方面。
我的目标是在编译之前不包含任何逻辑的列表。
我想要实现的一个例子是:
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?
无法以这种方式修改List<T>
类,因为Add
方法不是虚拟的。如果MyList
属性返回的是IList<string>
,那么它返回的对象可以执行这种类型的验证。
Collection<T>
类来帮助您扩展某些列表功能。实现你所描述的特性最简单的方法是从它派生一个类,并在InsertItem
中执行验证。
Collection<T>
类实现了IList<string>
,因此您仍然需要更改Foo.MyList
的属性类型。
Edit for AOP:如果您想为这个特性使用AOP,而不是从MyList
返回用户操作的列表,Foo
类将提供Add
和Remove
方法,它们在更改后备列表之前执行必要的验证。在这种情况下,我将从MyList
属性返回ReadOnlyCollection<T>
,以明确列表仅通过Foo
中提供的方法进行操作。
在。net中没有针对泛型列表的集合更改事件。我知道您不想听到这些,但是您要么需要包装List,要么需要创建一个实现illist的类。