.NET业务对象集合(列表)

时间:2015-11-30 21:38:11

标签: .net oop inheritance

我想创建一个业务对象集合类(T列表)。我的业务对象具有“已删除”属性(因此我可以在以后跟踪数据库删除)。集合类需要覆盖List的remove,for-each枚举方法等,以便我可以将业务对象标记为已删除而不是从列表中“物理”删除,并在枚举期间跳过它们。到目前为止,我有一个继承List(BusObject)的类,但我发现一些List方法(即Remove)不可覆盖。我接近这个错吗?也许我不应该继承List并使用我自己的方法在内部管理列表?

3 个答案:

答案 0 :(得分:1)

您可以实现自己的ICollection

如果您想写入数据库等,可以使用InternalCollection属性访问内部集合,包括已删除的项目。

选择为NotSupportedException方法抛出CopyTo,因为在那里实施的内容并不明显(我们是否也希望复制已删除的项目?)。

class SoftDeleteCollection<T> : ICollection<T>
    where T : class, ISoftDelete
{
    public ICollection<T> InternalCollection { get; private set; }

    public SoftDeleteCollection()
    {
        this.InternalCollection = new List<T>();
    }

    public IEnumerator<T> GetEnumerator()
    {
        return this.InternalCollection.Where(i => !i.IsDeleted).GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }

    public void Add(T item)
    {
        this.InternalCollection.Add(item);
    }

    public void Clear()
    {
        foreach (T item in this.InternalCollection.Where(item => !item.IsDeleted))
        {
            item.IsDeleted = false;
        }
    }

    public bool Contains(T item)
    {
        return this.InternalCollection.Any(i => i == item && !i.IsDeleted);
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        throw new NotSupportedException();
    }

    public bool Remove(T item)
    {
        if (this.Contains(item))
        {
            item.IsDeleted = true;
            return true;
        }
        return false;
    }

    public int Count
    {
        get { return this.InternalCollection.Count(item => !item.IsDeleted); }
    }

    public bool IsReadOnly
    {
        get { return false; }
    }
}

答案 1 :(得分:0)

继承Collection<T>类并覆盖RemoveItemClearItems等相应方法。 看看GetEnumerator

有关这方面的更多信息,请访问MSDN

当我考虑这个问题时,我认为另一种方法可能更容易,特别是在迭代集合并跳过软删除的项目时: 通过继承Collection<T>创建自己的集合类。删除项目时,不仅应设置IsDeleted标志,还应从集合中删除该项目,并将其添加到集合类中定义的其他集合中。

像这样:

public class MyBusinessCollection<T> : Collection<T> where T : BusObject
{
    private readonly List<T> _deletedItems = new List<T>();

    protected override RemoveItem( int index )
    {
       var item = this[index];

       item.Deleted = true;

       _deletedItems.Add(item);

       base.RemoveItem(index);
    }

    public IEnumerable<T> GetDeletedItems()
    {
         return _deletedItems;
    }
}

答案 2 :(得分:0)

看一下继承自ObservableCollection。这可能会对你有所帮助。

班级参考:https://msdn.microsoft.com/en-us/library/ms668604(v=vs.110).aspx

Sorta类似的帖子,其中有一个有用的评论:C# Custom Observable Collection - Should I use Composition or Inheritance?