65.9K
CodeProject 正在变化。 阅读更多。
Home

使用泛型创建 EventArgs

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.89/5 (7投票s)

2008年1月4日

CPOL

1分钟阅读

viewsIcon

55759

downloadIcon

246

使用泛型创建 EventArgs 以节省时间

引言

本文档描述了如何创建一个基于泛型的 EventArgs 类。

背景

我一直在做一个大型项目,需要编写大量的事件参数类,仅仅是为了在事件中传递不同类型的一个对象。

.NET 已经包含了一个泛型 EventHandler Delegate

 public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e); 

但是 TEventArgs 必须从 EventArgs 派生。
如果你想要一个包含 int 的事件,你的代码会像下面这样

   public class EventArgs_int : EventArgs
    {
        public int Target;
        public EventArgs_int(int i)
        {
            Target = i;
        }
    }

接下来,如果你想要一个包含 string 的事件,你将需要

  public class EventArgs_string : EventArgs
    {
        public string Target;
        public EventArgs_string(string s)
        {
            Target = s;
        }
    }

你需要为你想传递的每种对象类型创建一个不同的类,除非你创建一个传递像 object 这样的对象的类

   public class EventArgs_object : EventArgs
    {
        public object Target;
        public EventArgs_object(object o)
        {
            Target = o;
        }
    }

这个类可以工作,但是你无法获得智能感知,并且需要将对象转换为正确的类型。 在编写了大约 20 个不同的类之后,我产生了使用泛型的想法。

Using the Code

创建一个从 EventArgs 派生的泛型类

public class EventArgs_Generic<t>: EventArgs
{
    public EventArgs_Generic(t Target)
    {
        _TargetObject = Target;
    }
    private t _TargetObject;
    public t TargetObject
    {
        get
        {
            return _TargetObject;
        }
        set
        {
            _TargetObject = value;
        }
    }
}

现在,让我们创建一个简单的类来在事件中传递

   class SimpleObject
    {
        public SimpleObject()
        {
        }
        private int _Value;
        public int Value
        {
            get { return _Value; }
            set { _Value = value; }
        }

        private string _Name;
        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
    }

接下来,我们使用刚刚创建的类(SimpleObject)创建一个事件处理程序

public event EventHandler<EventArgs_Generic<SimpleObject>> SimpleObjectAdded;

要接收事件,你创建如下代码

    _Processor.SimpleObjectAdded += new EventHandler<EventArgs_Generic<SimpleObject>>
                    (_Processor_SimpleObjectAdded);

    void _Processor_SimpleObjectAdded(object sender, EventArgs_Generic<SimpleObject> e)
    {
        Console.WriteLine("New Object Name:{0} value: {1}",
                e.TargetObject.Name, e.TargetObject.Value);

        dataGridView1.DataSource = null;
        dataGridView1.DataSource = _Processor.SimpleObjects;
    }

太棒了!完全的类型安全(和类型提示)而无需为你想在事件参数中传递的每种类型创建不同的类。

我很喜欢它。希望你也一样!

历史

  • 2008年1月4日:初始发布
  • 2008年1月6日:更新文章以使意图更清晰
© . All rights reserved.