如何验证从List <T>派生的类中的添加?

ROB*_*SON 1 c# validation list

我们正处于将代码从C++转换为C#的项目的最开始.一位同事提出了一个包含List<T>成员的列表类.他并非衍生出来,List<T>因为在允许将项目添加到列表之前,他需要进行一些验证.

有一段时间,我认为派生自定义列表CollectionBase可能会有所帮助,但我认为CollectionBase现在已经过时,因为我们有泛型类.我在这里发现的一篇文章说,具有类似问题的用户应该从List <T> 派生并在派生类中执行验证,但它没有说明如何做到这一点.

例如,假设我想要一个只包含偶数整数的列表.在将其添加到列表之前,我将如何实现一个确保整数为止的检查?

dca*_*tro 9

你必须实施IList<T>.派生List<T>是不够的,因为诸如Add不可覆盖的方法 - 你可以放弃继承并隐藏基类实现,但那是......肮脏的.并且不安全.

所以只需实现IList<T>和使用组合:

public class EvenIntsList : IList<int>
{
    private readonly IList<int> _list; 

    public EvenIntsList()
    {
        _list = new List<int>();
    }

    public void Add(int item)
    {
        if(item % 2 == 0)
            _list.Add(item);
        else
            throw new ArgumentException("This list only allows even integers.", "item");
    }
}
Run Code Online (Sandbox Code Playgroud)

您还必须为其他IList<T>方法提供传递实现,例如:

public IEnumerable<int> GetEnumerable()
{
    return _list.GetEnumerable();
}
Run Code Online (Sandbox Code Playgroud)