C# 泛型EventArgs和扩展方法
我在互联网上寻找一种更容易触发事件的方法,我发现了这个扩展类:C# 泛型EventArgs和扩展方法,c#,.net,winforms,C#,.net,Winforms,我在互联网上寻找一种更容易触发事件的方法,我发现了这个扩展类: public static class EventExtensions { public static void Fire<TEventArgs>(this EventHandler<TEventArgs> @event, object sender, TEventArgs e) where TEventArgs : EventArgs { if (@event
public static class EventExtensions
{
public static void Fire<TEventArgs>(this EventHandler<TEventArgs> @event, object sender, TEventArgs e)
where TEventArgs : EventArgs
{
if (@event != null)
@event(sender, e);
}
}
而不是
if(TestEvent != null)
TestEvent(this, new CallEventArgs(1,"OK"));
因为我需要向我的事件传递一些参数,所以我想我将创建泛型EventArgs类:
public class EventArgs<T> : EventArgs
{
public EventArgs()
{
Value = default(T);
}
public EventArgs(T aValue)
{
Value = aValue;
}
public T Value { get; set; }
}
2.扩展事件,然后以这种方式编写扩展方法,这是一种好的做法吗
EventArgs
public static void Fire<T> (this EventHandler<EventArgs<T>> @event, object sender, T value)
{
if (@event != null)
@event(sender, new EventArgs<T>(value));
}
我很惭愧——我的代码中有不同的名称空间。一切正常。很抱歉,我的代码有错误,当我写问题时,我更正了有问题的代码。在我的代码中进行简单的修复之后,一切都正常了。无论如何,谢谢你回答我问题的第二部分:)再次感谢!很好的过载,我没有想到,我可以在那里添加其他有用的东西吗?:)如果您只需要启动自己的事件,那么没有什么可添加的。不幸的是,C#将不同类型的相同委托视为不同的委托,因此这些扩展方法无法处理框架本身中声明的许多事件。据我所知,除了添加越来越多的重载之外,没有什么可以做的。我只需要为我的事件使用它,因为现在我只使用这种类型的事件。谢谢
public event EventHandler<EventArgs<MyClass>> TestEvent;
if(TestEvent != null)
TestEvent(this, new EventArgs<MyClass>(new MyClass{Id = 1, Description = "OK"}));
TestEvent.Fire(...);
public static void Fire<T> (this EventHandler<EventArgs<T>> @event, object sender, T value)
{
if (@event != null)
@event(sender, new EventArgs<T>(value));
}
TestEvent.Fire(sender, new MyClass{Id = 1, Description = "OK"});