是否有可能拦截添加/删除方法在一个通用列表使用后尖

本文关键字:一个 列表 有可能 添加 方法 删除 是否 | 更新日期: 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>,那么它返回的对象可以执行这种类型的验证。

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

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

Edit for AOP:如果您想为这个特性使用AOP,而不是从MyList返回用户操作的列表,Foo类将提供AddRemove方法,它们在更改后备列表之前执行必要的验证。在这种情况下,我将从MyList属性返回ReadOnlyCollection<T>,以明确列表仅通过Foo中提供的方法进行操作。

在。net中没有针对泛型列表的集合更改事件。我知道您不想听到这些,但是您要么需要包装List,要么需要创建一个实现illist的类。