Feedback

Event to Observable (Rx)

Sprache: C#

Die FromEvent-Methoden der Reactive Extensions können nur Events verarbeiten, die vom Typ EventHandler bzw. EventHandler<T> sind. Dieses Snippet ermöglicht zwar nicht die Verarbeitung von Events aller Typen, aber immerhin wird Action<T> schon einmal unterstützt. Weitere Informationen in diesem Thread: http://dotnet-forum.de/forums/t/3304.aspx Ein Test, der die Anwendung demonstriert: [code] [TestMethod] public void Testing_event_2_observable_with_reflection() { string result = string.Empty; var sample = new EventSamples(); sample.Event2Observable<EventSamples, string>("ActionWithParameterEvent") .Subscribe(o => result = o); sample.FireStringActionEvent(_expected); Assert.AreEqual(_expected, result); } [/code]
public static IObservable<T> Event2Observable<TSource, T>(
         this TSource source, string eventName)
         where TSource : class
      {
         EventInfo info = source.GetType()
            .GetEvent(eventName, BindingFlags.Public | BindingFlags.Instance);
         if(info == null)
         {
            throw new InvalidOperationException(
               string.Format(CultureInfo.CurrentCulture,
               "Could not find event '{0}' on object of type '{1}'.",
               new object[] { eventName, source.GetType().FullName }));
         }
         return Observable.Create<T>(o =>
         {
            Action<T> handler = o.OnNext;
            info.AddEventHandler(source, handler);
            return () => info.RemoveEventHandler(source, handler);
         });
      }
public static IObservable<T> Event2Observable<TSource, T>(
         this TSource source, string eventName)
         where TSource : class
      {
         EventInfo info = source.GetType()
            .GetEvent(eventName, BindingFlags.Public | BindingFlags.Instance);
         if(info == null)
         {
            throw new InvalidOperationException(
               string.Format(CultureInfo.CurrentCulture,
               "Could not find event '{0}' on object of type '{1}'.",
               new object[] { eventName, source.GetType().FullName }));
         }
         return Observable.Create<T>(o =>
         {
            Action<T> handler = o.OnNext;
            info.AddEventHandler(source, handler);
            return () => info.RemoveEventHandler(source, handler);
         });
      }

1 Kommentar