Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建通用事件引发方法_C#_Asp.net_Events_Generics_Event Handling - Fatal编程技术网

C# 如何创建通用事件引发方法

C# 如何创建通用事件引发方法,c#,asp.net,events,generics,event-handling,C#,Asp.net,Events,Generics,Event Handling,我有一组具有相同签名的事件。现在我想知道是否可以创建一个通用的事件处理程序提升方法来为所有事件执行此操作 是否可以将事件发送为 请参阅。它描述了你想要什么 通过使用类型化委托并将其用于事件,可以创建类型化事件: public delegate void myDel<T>(T stuff); public event myDel<int> myEvent; public doStuff() { myDel(1); } public delegate void

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

  • 是否可以将事件发送为
    • 请参阅。它描述了你想要什么

      通过使用类型化委托并将其用于事件,可以创建类型化事件:

      public delegate void myDel<T>(T stuff);
      
      public event myDel<int> myEvent;
      
      public doStuff()
      {
          myDel(1);
      }
      
      public delegate void myDel(T stuff);
      公共活动myDel myEvent;
      公共场所
      {
      迈德尔(1);
      }
      
      如果这些都在一个类中,则可以创建一个方法来引发事件,该方法可与其中任何一个类一起工作。例如,如果您的事件都是
      EventHandler
      ,则可以使用:

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

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

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

      这不仅不符合OP的要求,也不适合仅仅发布一个链接,即使它确实回答了问题。在这个i实现中,在检查null以避免竞争条件之前,是否需要将handler放入局部变量中?@mohsen.d没有竞争条件。eventHandler是一个参数。@Reed Copsey抱歉,您能再解释一下吗?感谢you@mohsen.d否-当您将其作为参数传入时,它会有效地执行相同的操作
      eventHandler
      成为方法中使用的“局部变量”,因此您没有竞争条件。@mohsen.d只有类本身才能引发它的事件。您可以传递一个
      Func
      并使用lambda来提升它,但是在调用端它会变得有点丑陋。通常,在子类中重做此操作更容易。
      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;
          }
      }
      
      public event EventHandler<FooArgs> FooHappend;
      
      public void Foo()
      {
          Event.Raise(this, FooHappend, new FooArgs("Hello World!");
      }