通用EventArgs和扩展方法

时间:2014-02-21 11:07:34

标签: 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 != 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.扩展事件然后以这种方式向它们编写扩展方法是一种很好的做法吗?

1 个答案:

答案 0 :(得分:3)

  1. 您无需修改​​任何内容,您的扩展方法应与通用EventArgs<T>一起使用。

  2. 这种方法很好,没有什么不妥。

  3. 您可能需要添加以下重载:

    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"});