.net 修改集合(添加或删除项)时运行代码

.net 修改集合(添加或删除项)时运行代码,.net,collections,.net,Collections,我有一个包含对象列表的类。修改列表时,在类中运行某些代码的最佳方式是什么 class MyManagerClass { ArrayList list = new ArrayList(); // will likely be a different collection class private OnItemAddedToList(object o) { // how to call this? } private OnItemRemov

我有一个包含对象列表的类。修改列表时,在类中运行某些代码的最佳方式是什么

class MyManagerClass
{
    ArrayList list = new ArrayList(); // will likely be a different collection class
    private OnItemAddedToList(object o)
    {
        // how to call this?
    }

    private OnItemRemovedFromList(object o)
    {
        // how to call this?  
    }
}

<>而不是使用Sale.St集合中的ARARYLIST。它有类似于
CollectionChanged
itemsadded
等事件。

到目前为止,我使用的方法是创建一个派生自
System.Collections.ObjectModel.collection
的私有集合类,并直接在覆盖中调用这些方法:

class MyManagerClass
{
    private class MyCollection : System.Collections.ObjectModel.Collection<object>
    {
        private MyManagerClass manager;

        private MyCollection(MyManagerClass manager)
        {
            this.manager = manager;
        }

        protected override void InsertItem(int index, object item)
        {
            base.InsertItem(index, item);
            manager.OnItemAddedToList(item);
        }

        protected override void SetItem(int index, object item)
        {
            object oldItem = (index < base.Count) ? base[index] : null;
            base.SetItem(index, item);

            if (oldItem != null) {
                manager.OnItemRemovedFromList(oldItem);
            }

            manager.OnItemAddedToList(item);
        }

        protected override void RemoveItem(int index, object item)
        {
            base.RemoveItem(index, item);
            manager.OnItemRemovedFromList(item);
        }
    }

    private OnItemAddedToList(object o)    
    {
    }

    private OnItemRemovedFromList(object o)    
    {
    }
}
类MyManagerClass
{
私有类MyCollection:System.Collections.ObjectModel.Collection
{
私人MyManagerClass经理;
私人MyCollection(MyManagerClass manager)
{
this.manager=经理;
}
受保护的重写void插入项(int索引,对象项)
{
基本插入项(索引,项目);
项目经理(项目);
}
受保护的覆盖无效集合项(整数索引,对象项)
{
对象oldItem=(索引

我不确定这是否是正确的方法,我想看看是否有更好的替代方法。

就我个人而言,我将在一个类中实现
IList
,该类已添加
删除
替换
事件/委托。该类将有一个类型为
List
的私有实例成员,所有实现的调用都将委托给该成员,并引发事件

如果愿意,您还可以使用
OnBefore…
OnAfter
,允许您“取消”元素的添加/删除

这是典型的做法,但正如mookid所说,可能有一些现有的库也在做类似的事情。
DataTable
类实现了与
DataRow
类类似的概念,包括添加、删除和更新


您可以将这些概念组合起来,以便添加到集合中的项可以将“代码> OnChchange < /Cuff>事件“冒泡”集中到集合中,并可用于在集合中重新生成<代码> ITMechange 事件。

< P>您还可以考虑使用<代码> Stask.ObjistMask.VistabeCelpEng/<代码>类,它以CollectionChanged事件的形式为您提供此信息,该事件为您提供有关更改内容的信息。

如果您仍在编写自定义集合,则可以实现
INotifyCollectionChanged
inotifPropertyChanged
接口。它们添加您可以订阅的事件,当集合数据以某种方式发生更改时通知侦听器。
这样,您可以在集合之外的代码中订阅事件

或者,您可以使用实现这两个接口的
ObservableCollection
类。
INotifyCollectionChanged
接口和
ObservableCollection
仅在.Net Framework 3.0及更高版本中可用


在.Net Framework 2.0上,您可以使用
IBindingList
接口来获得相同的功能,但它的实现比3.0中的
INotifyCollectionChanged
接口要复杂得多。在2.0及更高版本中,有
BindingList
接口,它具有可观察集合的所有必要挂钩。现在还有一个(如前所述)与之非常相似的
ObservableCollection


collection
派生新集合在许多情况下也是相当合理的。但是不要从
列表中派生,因为它没有(有用的)虚拟方法。

冒泡事件正是我寻找此功能的原因。具有活动的集合是否是良好的实践?这个想法似乎让人不舒服,因为它听起来像是微软已经实现的东西,如果它在某种程度上还不错的话。2.0中有类似的东西吗?有活动的收藏是否是良好的实践?这听起来像是微软从一开始就应该实现的东西,如果它在某种程度上不坏的话。你是对的。我99%确信2.0中有类似的接口可用。我来看看。我找到了:-)IBindingList接口可以这样使用。哦。我不明白为什么将事件添加到列表中会很糟糕。您只在需要订阅服务器的地方添加订阅服务器,因此在所有其他情况下,事件都在那里,什么也不做。IBindingList似乎有点过火,因为PropertyDescriptor进行了所有排序和搜索。。。它得到了正确的事件,但是在这一点上实现它是一件非常麻烦的事情,仅仅是为了一般性地公开特性。我想这就是为什么他们把它分成3.0。