首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用EventArgs与扩展方法

通用EventArgs与扩展方法
EN

Stack Overflow用户
提问于 2014-02-21 11:07:33
回答 1查看 690关注 0票数 2

我在网上寻找一种更容易引发事件的方法,我发现了这个扩展类:

代码语言:javascript
复制
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);
    }
}

这允许我使用

代码语言:javascript
复制
TestEvent.Fire(this,new CallEventArgs(1,"OK"));

而不是

代码语言:javascript
复制
if(TestEvent != null)
    TestEvent(this, new CallEventArgs(1,"OK"));

因为我需要向我的事件传递一些参数,所以我认为我将创建通用的EventArgs类:

代码语言:javascript
复制
public class EventArgs<T> : EventArgs
{
    public EventArgs()
    {
        Value = default(T);
    }

    public EventArgs(T aValue)
    {
        Value = aValue;
    }

    public T Value { get; set; }
}

有了这个,我可以宣布我的事件为:

代码语言:javascript
复制
public event EventHandler<EventArgs<MyClass>> TestEvent; 

然后用以下方式开火:

代码语言:javascript
复制
if(TestEvent != null)
    TestEvent(this, new EventArgs<MyClass>(new MyClass{Id = 1, Description = "OK"}));

我的问题是:

1.我应该如何修改我的扩展方法,以便能够像下面这样调用我的事件?

代码语言:javascript
复制
TestEvent.Fire(...);

2.以这种方式扩展事件,然后编写扩展方法,这是一种很好的实践吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-21 11:15:38

  1. 您不需要修改任何东西,您的扩展方法应该可以很好地处理一般的EventArgs<T>
  2. 这个方法很好,没什么不对。
  3. 您可能需要添加以下重载: 公共静态void (此EventHandler @事件、对象发送方、T值){ if ( @event != null) @event(发件人,新EventArgs(值));} 这样,你就可以引发这样的事件: TestEvent.Fire(发送方,新的MyClass{Id = 1,Description = "OK"});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21932706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档