Jelajahi Sumber

Some improvements to FromEvent[Pattern].

Bart De Smet 8 tahun lalu
induk
melakukan
a3f6f63294

+ 3 - 3
Rx.NET/Source/src/System.Reactive/Linq/Observable/FromEvent.cs

@@ -190,7 +190,7 @@ namespace System.Reactive.Linq.ObservableImpl
         }
     }
 
-    abstract class EventProducer<TDelegate, TArgs> : Producer<TArgs>
+    internal abstract class EventProducer<TDelegate, TArgs> : Producer<TArgs>
     {
         private readonly IScheduler _scheduler;
         private readonly object _gate;
@@ -229,7 +229,7 @@ namespace System.Reactive.Linq.ObservableImpl
             return connection;
         }
 
-        class Session
+        private sealed class Session
         {
             private readonly EventProducer<TDelegate, TArgs> _parent;
             private readonly Subject<TArgs> _subject;
@@ -346,7 +346,7 @@ namespace System.Reactive.Linq.ObservableImpl
         }
     }
 
-    abstract class ClassicEventProducer<TDelegate, TArgs> : EventProducer<TDelegate, TArgs>
+    internal abstract class ClassicEventProducer<TDelegate, TArgs> : EventProducer<TDelegate, TArgs>
     {
         private readonly Action<TDelegate> _addHandler;
         private readonly Action<TDelegate> _removeHandler;

+ 19 - 7
Rx.NET/Source/src/System.Reactive/Linq/Observable/FromEventPattern.cs

@@ -15,7 +15,7 @@ namespace System.Reactive.Linq.ObservableImpl
 {
     internal sealed class FromEventPattern
     {
-        public class Impl<TDelegate, TEventArgs> : ClassicEventProducer<TDelegate, EventPattern<TEventArgs>>
+        public sealed class Impl<TDelegate, TEventArgs> : ClassicEventProducer<TDelegate, EventPattern<TEventArgs>>
         {
             private readonly Func<EventHandler<TEventArgs>, TDelegate> _conversion;
 
@@ -48,7 +48,7 @@ namespace System.Reactive.Linq.ObservableImpl
             }
         }
 
-        public class Impl<TDelegate, TSender, TEventArgs> : ClassicEventProducer<TDelegate, EventPattern<TSender, TEventArgs>>
+        public sealed class Impl<TDelegate, TSender, TEventArgs> : ClassicEventProducer<TDelegate, EventPattern<TSender, TEventArgs>>
         {
             public Impl(Action<TDelegate> addHandler, Action<TDelegate> removeHandler, IScheduler scheduler)
                 : base(addHandler, removeHandler, scheduler)
@@ -62,7 +62,7 @@ namespace System.Reactive.Linq.ObservableImpl
             }
         }
 
-        public class Handler<TSender, TEventArgs, TResult> : EventProducer<Delegate, TResult>
+        public sealed class Handler<TSender, TEventArgs, TResult> : EventProducer<Delegate, TResult>
         {
             private readonly object _target;
             private readonly Type _delegateType;
@@ -103,14 +103,12 @@ namespace System.Reactive.Linq.ObservableImpl
 #if HAS_WINRT
                     if (_isWinRT)
                     {
-                        var token = _addMethod.Invoke(_target, new object[] { handler });
-                        removeHandler = () => _removeMethod.Invoke(_target, new object[] { token });
+                        removeHandler = AddHandlerCoreWinRT(handler);
                     }
                     else
 #endif
                     {
-                        _addMethod.Invoke(_target, new object[] { handler });
-                        removeHandler = () => _removeMethod.Invoke(_target, new object[] { handler });
+                        removeHandler = AddHandlerCore(handler);
                     }
                 }
                 catch (TargetInvocationException tie)
@@ -130,6 +128,20 @@ namespace System.Reactive.Linq.ObservableImpl
                     }
                 });
             }
+
+            private Action AddHandlerCore(Delegate handler)
+            {
+                _addMethod.Invoke(_target, new object[] { handler });
+                return () => _removeMethod.Invoke(_target, new object[] { handler });
+            }
+
+#if HAS_WINRT
+            private Action AddHandlerCoreWinRT(Delegate handler)
+            {
+                var token = _addMethod.Invoke(_target, new object[] { handler });
+                return () => _removeMethod.Invoke(_target, new object[] { token });
+            }
+#endif
         }
     }
 }