1

我是 AOP 的新手并发布了尖锐的 (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?

4

2 回答 2

3

没有办法以List<T>这种方式修改类,因为该Add方法不是虚拟的。如果该MyList属性返回一个IList<string>,那么它返回的对象可以执行这种类型的验证。

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

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

编辑 AOP:如果你想为这个特性使用 AOP,而不是从MyList用户操作的列表中返回一个列表,Foo该类将提供在对支持列表进行更改之前执行必要验证的方法AddRemove在这种情况下,我会ReadOnlyCollection<T>MyList属性返回以明确列表仅通过Foo.

于 2013-03-26T15:09:37.240 回答
1

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

于 2013-03-26T15:04:18.880 回答