如何使用IObservable订阅TypedEventHandler <T,TArgs>事件

时间:2019-08-30 04:23:14

标签: system.reactive

我正在尝试以下方法,

var _connectedAnimation = ConnectedAnimationService.GetForCurrentView().GetAnimation("forwardAnimation");

Observable.FromEvent<TypedEventHandler<ConnectedAnimation, object>, object>(
          handler => _connectedAnimation.Completed += handler,
          handler => _connectedAnimation.Completed -= handler)

但是,当引发事件时,我会收到运行时异常

System.ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.
  at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method, Boolean throwOnBindFailure)
  at System.Reactive.ReflectionUtils.CreateDelegate[TDelegate](Object o, MethodInfo method) in D:\a\1\s\Rx.NET\Source\src\System.Reactive\Internal\ReflectionUtils.cs:line 24
  at System.Reactive.Linq.ObservableImpl.FromEvent`2.GetHand

完成的事件定义为

public sealed class ConnectedAnimation : IConnectedAnimation, IConnectedAnimation2, IConnectedAnimation3
{
    /// <summary>Occurs when the animation is finished.</summary>
    public extern event TypedEventHandler<ConnectedAnimation, object> IConnectedAnimation.Completed;
}

1 个答案:

答案 0 :(得分:1)

由于这不是标准事件,并且因为有多个事件参数,所以我们需要创建一个Tuple。请参阅Rx.Net in Action中的4.2.3. Events with multiple parameters

Observable.FromEvent<TypedEventHandler<ConnectedAnimation, object>, Tuple<ConnectedAnimation, object>>(
    rxHandler => (animation, o)=> rxHandler(Tuple.Create(animation,o)),
    handler => _connectedAnimation.Completed += handler,
    handler => _connectedAnimation.Completed -= handler)
相关问题