繁体   English   中英

C#如何在更改静态Arraylist计数时触发事件?

[英]C# How to trigger an event when a static Arraylist count is changed?

我在一个名为cart的类中有一个静态数组列表,有没有一种方法可以实现其他类使用的事件侦听器? 我是C#的新手,试图了解PropertyChangedEventHandler并没有成功。 arraylist和property初始化如下:

private static ArrayList cartList = new ArrayList();

    public static ArrayList CartList
    {
        get { return cartList; }
        set
        {
            cartList = value;
        }
    }

编辑:

通过隐藏基本方法,更改了@KMC代码以使用List:

public class ListOfProducts : List<Product>
{

    public void Add(Product obj)
    {
        base.Add(obj);
        this.OnChange();
    }

    public void UpdateLast(Product obj)
    {
        base[base.Count - 1] = obj;
        this.OnChange();
    }
    public void Remove(Product obj)
    {
        base.Remove(obj);
        this.OnChange();
    }

    public void Clear()
    {
        base.Clear();
        this.OnChange();
    }

    public event EventHandler Change;

    protected void OnChange()
    {
        if (this.Change != null)
        {
            this.Change(this, new EventArgs() { });
        }
    }
}

ArrayList中元素的数量更改或任何元素更改时,您都不会收到通知。

ArrayList和.Net Framework中的大多数其他标准集合(如List<T>Dictionary和数组)(WPF中的ObservableCollection之类的专门类除外)不提供有关已添加/已删除项目的通知。 您可以通过查看对应类的MSDN条目并查看其是否实现INotifyCollectionChanged和/或INotifyPropertyChanged来轻松地检查该条目。 即, ArrayList仅实现IList, ICollection, IEnumerable, ICloneable并且没有通知接口。

如果您需要此类更改的通知,则应使用此类通知创建自己的类或使用ObservableCollection

旁注:请考虑使用List<T>而不是非通用ArrayList - C#中的ArrayList与List <>

ArrayList类型是可扩展的。 您可以覆盖add和remove方法并触发一些事件。

对于前)

public class NewArrayList : ArrayList 
{
    public event EventHandler Change; 

    public override int Add(object value)
    { 
       var result = base.Add(value);
        this.OnChange();
        return result;
    }

    public override void Remove(object obj)
    {
        base.Remove(obj);
        this.OnChange();
    }

    protected void OnChange()
    {
        if (this.Change != null)
        {
            this.Change(this, new EventArgs() { });
        }
    }
}
public static class program
{ 
    static void Main(string[] args)
    {

        var list = new NewArrayList();
        list.Change += delegate (object sender, EventArgs arg) {
            Console.WriteLine("collect changed {0}", list.Count);
        };

        list.Add(1);
        list.Add(2);
        list.Remove(2);

    }  

}

由于ArrayList需要发送某种类型的消息(事件),并且我不确定谁会接收到该消息,因此我将由您自己决定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM