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:
[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);
}
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 Kommentare zum Snippet