One shot events using Lambda in C#

前端 未结 8 1714
無奈伤痛
無奈伤痛 2021-01-31 07:55

I find myself doing this sort of thing quite often:-

 EventHandler eh = null;  //can\'t assign lambda directly since it uses eh
 eh = (s, args) =>
 {
     //s         


        
8条回答
  •  我在风中等你
    2021-01-31 08:17

    You can use reflection:

    public static class Listener {
    
      public static void ListenOnce(this object eventSource, string eventName, EventHandler handler) {
        var eventInfo = eventSource.GetType().GetEvent(eventName);
        EventHandler internalHandler = null;
        internalHandler = (src, args) => {
          eventInfo.RemoveEventHandler(eventSource, internalHandler);
          handler(src, args);
        };
        eventInfo.AddEventHandler(eventSource, internalHandler);
      }
    
      public static void ListenOnce(this object eventSource, string eventName, EventHandler handler) where TEventArgs : EventArgs {
        var eventInfo = eventSource.GetType().GetEvent(eventName);
        EventHandler internalHandler = null;
        internalHandler = (src, args) => {
          eventInfo.RemoveEventHandler(eventSource, internalHandler);
          handler(src, args);
        };
        eventInfo.AddEventHandler(eventSource, internalHandler);
      }
    
    }
    

    Use it like so:

    variableOfSomeType.ListenOnce("SomeEvent", 
      (s, args) => Console.WriteLine("I should print only once!"));
    
    variableOfSomeType.ListenOnce("SomeOtherEvent", 
      (s, args) => Console.WriteLine("I should print only once!"));
    

提交回复
热议问题