在MSDN中有如下对EventHandler委托的定义:表示将处理不包含事件数据的事件的方法并做下说明:
EventHandler 是一个预定义的委托,专用于表示不生成数据的事件的事件处理程序方法。如果事件生成数据,则必须提供自己的自定义事件数据类型,并且必须要么创建一个委托,其中第二个参数的类型为自定义类型,要么使用泛型 EventHandler<TEventArgs> 委托类并用自定义类型替代泛型类型参数。这里有些不解的是生成数据是指EventArgs的派生类包含了事件发行者的相关数据吗?下面的代码是否正确呢? public class BallEventArgs : EventArgs
    {
        public int Trajectory { get; private set; }
        public int Distance { get; private set; }
        public BallEventArgs(int Trajectory, int Distance)
        {
            ........                     
        }
    }      class Ball   
       {
        public event EventHandler BallInPlay;                
        public void OnBallInPlay(BallEventArgs e                    
           {
            if (BallInPlay != null)               
               BallInPlay(this , e);                  
           }  
       }         class Pitcher    
         { 
            public Pitcher(Ball ball)        
             {
                ball.BallInPlay += new EventHandler(ball_BallInPlay);                    
              }            void ball_BallInPlay(object sender, EventArgs e)
             {
                ...........
             }
          }

解决方案 »

  1.   

    不正确你贴的说明说的很明白了,因为你要在事件参数中加入特有属性,所以你应该使用
    EventHandler<TEventArgs> 而不是EventHandlerpublic event EventHandler BallInPlay;  -》 public event EventHandler<BallEventArgs> BallInPlay;void ball_BallInPlay(object sender, EventArgs e)
      {
      ...........
      }
    void ball_BallInPlay(object sender, BallEventArgs e)
      {
      ...........
      }
      

  2.   

    但我的代码同样可以运行。我就是不解这句话:表示将处理不包含事件数据的事件的方法
    的意思EventHandler 是一个预定义的委托,专用于表示不生成数据的事件的事件处理程序方法。如果事件生成数据,则必须提供自己的自定义事件数据类型,并且必须要么创建一个委托,其中第二个参数的类型为自定义类型,要么使用泛型 EventHandler<TEventArgs> 委托类并用自定义类型替代泛型类型参数。
      

  3.   

    其实EventHandler也可用于表示不生成数的事件的事件处理程序方法,只是要加以下代码:private static void SampleEventHandler(object reader, EventArgs e)
            {
                if (e is MyEventArgs )           
                    {
                      MyEventArgs myEventArgs = e as MyEventArgs;
                                     
                  }
            }
      

  4.   

    你的代码是可以运行,但在事件委托的方法中
    void ball_BallInPlay(object sender, EventArgs e)
      {
      ...........
      }
      }
    应为参数是EventArgs ,所以不能获取到事件传递出来参数值,比如Trajectory 和Distance ,当然你写的代码倒是可以把EventArgs 强制转换成BallEventArgs ,不过如果这个事件你是给别人用的,人家怎么知道EventArgs 实际上是BallEventArgs 。
    表示将处理不包含事件数据的事件的方法这个给你举个例子吧,加入你在做一个状态改变的事件,一般在使用这个事件的人通常希望知道改变前的状态和改变后的状态都是什么,你怎么给他这两个状态呢?做法就是声明一个继承EventArgs 类,在这个类里面加上2个属性改变前后的状态,并在触发事件代码里面复制,这样消费你的事件的人就可以知道改变前后的状态了。
    但有些事件是不需要传递任何值的,比如点击按钮事件,这个直接用EventArgs 好了。建议你看看在没有泛型EventHandler强怎么声明自定义参数事件肯能对你理解这个更有好处。
      

  5.   

    是的CMIC说的有道理,虽然用类型强制转换也可以使用EventHandler,但对于包含事件数据的事件的方法,采用继承EventArgs的类型参数和自定义委托类型其阅读性更好。