使用泛型创建 EventArgs
使用泛型创建 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日:更新文章以使意图更清晰