用于获取Collection的添加/删除事件的泛型类

时间:2012-03-15 12:34:40

标签: c# collections encapsulation

  1. 您如何看待这个封装集合的解决方案,并且能够知道何时添加/删除它。

  2. 如何在xml描述中添加clicable链接?

    // Why does DoNotExposeGenericLists recommend that I expose Collection instead of List? by David Kean"
    // http://blogs.msdn.com/b/codeanalysis/archive/2006/04/27/585476.aspx
    public class CollectionEx<T> : Collection<T>
    {
    public event EventHandler ItemAdded;
    public event EventHandler ItemRemoved;
    
    public CollectionEx()//:base()
    {
    }
    
    protected override void InsertItem(int index, T item)
    {
        base.InsertItem(index, item);
        OnSectionAdded(EventArgs.Empty);
    }
    
    protected override void RemoveItem(int index)
    {
        base.RemoveItem(index);
        OnSectionRemoved(EventArgs.Empty);
    }
    
    public new void Add(T item)
    {
        base.Add(item);
        OnSectionAdded(EventArgs.Empty);
    }
    public new bool Remove(T item)
    {
        bool ok = base.Remove(item);
        OnSectionRemoved(EventArgs.Empty);
        return ok;
    }
    
    protected override void ClearItems()
    {
        base.ClearItems();
    }
    
    protected virtual void OnSectionRemoved(EventArgs e)
    {
        EventHandler handler = this.ItemRemoved;
        if (handler != null)
        {
            handler(this, e);
        }
    }
    
    protected virtual void OnSectionAdded(EventArgs e)
    {
        EventHandler handler = this.ItemAdded;
        if (handler != null)
        {
            handler(this, e);
        }
    }
    

    }

3 个答案:

答案 0 :(得分:8)

您可以使用ObservableCollection<T>来实现此目的。不需要自己写。

此外:当继承Collection<T>时,它足以覆盖受保护的虚拟方法。所有其他公共方法都会调用它们 如果您按照自己的方式另外隐藏非虚拟事件,则可能会多次触发事件(在您的情况下,清除集合时,不会触发任何事件)。

答案 1 :(得分:2)

已存在类似的内容,请查看ObservableCollection<T>.

答案 2 :(得分:1)

.NET 4.0附带ObservableCollectionCollectionChanged事件提供有关已修改,添加或删除内容的详细信息。