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.扩展事件,然后以这种方式编写扩展方法,这是一种好的做法吗

  • 您不需要修改任何内容,您的扩展方法应该可以很好地处理generic
    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"});