自定义了2种数据类型:dt1、d2t,下面的代码继承了EventArgs,并自定义委托和事件//继承EventArgs
public class MyEventArgs1 : EventArgs
    {
        public dt1 src;
        public MyEventArgs1(dt1 src)
        {
            this.src = src;
        }public class MyEventArgs2 : EventArgs
    {
        public dt2 src;
        public MyEventArgs1(dt2 src)
        {
            this.src = src;
        }
//定义委托
public delegate void DelegateMethod1(object sender,MyEventArgs1 e);
public delegate void DelegateMethod2(object sender,MyEventArgs2 e);
//定义事件
public event DelegateMethod1 mEvent1;
public event DelegateMethod2 mEvent2;还有触发、响应事件的代码,就不一一罗列了。
问题:在实际项目中,我的自定义数据类型多达数十种,其对应的委托和事件也多达数十个,难道我需要都将其逐一写出来吗?
注意到这几十个事件的区别仅仅是传递的事件参数的类型不同,我想到的一个办法是继承EventArgs时直接写成下面的样子:public class MyEventArgs1 : EventArgs
    {
        public object src;
        public MyEventArgs1(object src)
        {
            this.src = src;
        }
这样我就只写一个委托和相应的事件就行了,到了事件处理程序中,再去转换事件参数的类型:dt1 e1=(dt1)e;不知道这样做有什么利弊?
另外,是否可以用泛型来解决这个事件参数类型不确定的问题?如果可行,会很理想的。我对泛型比较陌生,望高手指点,谢谢!

解决方案 »

  1.   

    可以public class MyEventArgs<T> : EventArgs
    {
            public T src;
            public MyEventArgs1(T src)
            {
                this.src = src;
            }
    }
      

  2.   

    你的思路是正确的,而且.net api里就有这样的类型:EventHandler<T>event EventHandler<EventArgs> myEvent1;不过你事件的定义不能少。
      

  3.   

    红色的部分,替换成你自定义的 EventArgs 类型
      

  4.   

    本帖最后由 caozhy 于 2011-07-09 17:05:28 编辑
      

  5.   

    框架本身也提供了一个泛型的委托public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e) where TEventArgs: EventArgs