2011-02-09 68 views
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,没有客户端类的成员。

回答

6

更改事件的args到:

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; 
    } 
1

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

3

应该不是你的事件处理程序声明如下:

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

+0

类声明不起作用,在那里......这里不是`EventHandler `。没有`EventArgs `。请参阅:http://stackoverflow.com/questions/3312134/does-net-have-a-built-in-eventargst – 2011-02-09 19:44:46

+0

@Reed,我知道 - 我曾假设OP已经自己写了这个变体(他的代码显示他做到了。) – 2011-02-09 20:31:29

1

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

相关问题