【问题标题】:how to create a generic event raising method如何创建通用事件引发方法
【发布时间】:2012-09-20 13:53:31
【问题描述】:

我有一组具有相同签名的事件。现在我想知道是否可以创建一个通用事件处理程序引发方法来为所有事件执行此操作?

  • 是否可以以<T> 发送事件?

【问题讨论】:

    标签: c# asp.net events generics event-handling


    【解决方案1】:

    this。它描述了你想要什么。

    您可以使用类型化委托创建类型化事件并将其用于您的事件:

    public delegate void myDel<T>(T stuff);
    
    public event myDel<int> myEvent;
    
    public doStuff()
    {
        myDel(1);
    }
    

    【讨论】:

    • 这不仅看起来不像 OP 想要的那样,而且在 SO 上 just 发布链接也是不合适的,即使它确实回答了问题。 more info
    【解决方案2】:

    如果这一切都在一个类中,您可以创建一个方法来引发与它们中的任何一个一起使用的事件。例如,如果您的事件都是EventHandler&lt;T&gt;,您可以使用:

    private void RaiseEvent<T>(EventHandler<T> eventHandler, T eventArgs)
    {
        if (eventHandler != null)
        {
            eventHandler(this, eventArgs);
        } 
    }
    

    然后您可以通过以下方式调用它:

    this.RaiseEvent(this.MyEvent, new MyEventArgs("Foo"));
    

    【讨论】:

    • 有了这个实现,是否需要在检查 null 之前将处理程序放入局部变量以避免竞争条件?
    • @mohsen.d 没有竞争条件。 eventHandler 是一个参数。
    • @Reed Copsey 抱歉,您能解释一下吗?谢谢
    • @mohsen.d 否 - 当您将其作为参数传入时,它实际上会执行相同的操作。 eventHandler 成为方法中使用的“局部变量”,因此您没有竞争条件。
    • @mohsen.d 只有类本身可以引发它的事件。你可以传递一个Func&lt;EventHandler&lt;T&gt;&gt; 并使用一个 lambda 来提升它,但是在调用端它会变得有点丑陋。在子类中重做这个通常更容易。
    【解决方案3】:

    对于 Reed Copsey 回复的静态版本,我创建了一个静态类Event

    public static class Event
    {
        public static bool Raise<T>(Object source, EventHandler<T> eventHandler, T eventArgs) where T : EventArgs
        {
            EventHandler<T> handler = eventHandler;
            if (handler != null)
            {
                handler(source, eventArgs);
                return true;
            }
            return false;
        }
    }
    

    这还假设您的事件处理程序是EventHandler&lt;T&gt; 类型。返回类型从void 更改为bool,并返回是否有任何事件的侦听器。很少使用,请随时改回void

    使用示例:

    public event EventHandler<FooArgs> FooHappend;
    
    public void Foo()
    {
        Event.Raise(this, FooHappend, new FooArgs("Hello World!");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 2016-09-14
      • 2015-10-03
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多