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