4

我正在处理的项目要求我能够在每次将项目添加到列表时触发事件。为此,我创建了一个继承自 List 的自定义 List 类并添加了一个 OnAdd 事件。我还想返回作为 EventArgs 添加的项目,为此我添加了更多代码(如下所示):

    public class ClientListObservable<Client>:List<Client>
    {
        public event EventHandler<EventArgs<Client>> OnAdd;

        public void Add(Client item)
        {
            if (null != OnAdd)
            {
                OnAdd(this, new EventArgs<Client>(item));
            }

            base.Add(item);
        }
    }

    public class EventArgs<Client> : EventArgs
    {
        public EventArgs(Client value)
        {
            m_value = value;
        }

        private Client m_value;

        public Client Value
        {
            get { return m_value; }
        }
    }

这就是我添加处理程序的方式

clientList.OnAdd += new EventHandler<EventArgs<Client>>(clientList_OnAdd);

但是,在 OnAdd 方法中:

private void clientList_OnAdd(object sender, EventArgs e)
        {
            //want to be able to access the data members of the Client object added
        }

我只能访问 e.Equals、e.GetHashCode、e.GetType 和 e.ToString,而不能访问 Client 类的任何成员。

4

4 回答 4

6

将您的事件参数更改为:

public class ClientEventArgs : EventArgs
{
    public ClientEventArgs(Client value)
    {
        m_value = value;
    }

    private Client m_value;

    public Client Value
    {
        get { return m_value; }
    }
}

然后:

    private void clientList_OnAdd(object sender, ClientEventArgs e)
    {
        Client client = e.Value;
    }
于 2011-02-09T19:43:55.683 回答
3

您的事件处理程序不应该这样声明:

private void clientList_OnAdd(object sender, EventArgs<Client> e)

?

于 2011-02-09T19:42:52.713 回答
1

您应该从 EventArgs 派生您的自定义类,并有一个成员在其中托管您的自定义对象,然后您应该调用传递此类专用 EventArgs 的事件,您将根据需要创建和初始化。

于 2011-02-09T19:42:52.373 回答
1

创建您自己的事件参数,扩展 EventArgs 并具有“客户端”对象的公共属性。然后在添加时使用新项目填充自定义 EventArgs 并将其返回。

于 2011-02-09T19:44:58.863 回答