我正在通过互联网查找更轻松的事件,我找到了这个扩展类:
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);
}
}
这允许我使用
触发事件TestEvent.Fire(this,new CallEventArgs(1,"OK"));
而不是
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; }
}
有了这个,我可以将我的事件声明为:
public event EventHandler<EventArgs<MyClass>> TestEvent;
用以下方法解雇:
if(TestEvent != null)
TestEvent(this, new EventArgs<MyClass>(new MyClass{Id = 1, Description = "OK"}));
我的问题是:
1.如何修改我的扩展方法以便能够如下调用我的活动?
TestEvent.Fire(...);
2.扩展事件然后以这种方式向它们编写扩展方法是一种很好的做法吗?
答案 0 :(得分:3)
您无需修改任何内容,您的扩展方法应与通用EventArgs<T>
一起使用。
这种方法很好,没有什么不妥。
您可能需要添加以下重载:
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"});