0

我为 Rx 和 WPF 编写了以下方便的(或者我认为的)扩展方法:

public static IObservable<EventPattern<TViewModel, PropertyChangedEventArgs>>
            CreatePropertyChangedObservable<TViewModel>(this TViewModel vm) where TViewModel : INotifyPropertyChanged
        {
            return Observable.FromEventPattern<PropertyChangedEventHandler, TViewModel, PropertyChangedEventArgs>(
                h => vm.PropertyChanged += h, h => vm.PropertyChanged -= h);
        }

在某些项目中,这可以正常工作。但在其他情况下,ArgumentException当我尝试为返回的可观察对象订阅委托时,我从 Rx 代码深处收到消息“无法绑定到目标方法,因为它的签名或安全透明度与委托类型的签名或安全透明度不兼容” . 我的委托绝对具有正确的签名,并且具有完全相同类型的完全相同的代码在一个项目中成功但在另一个项目中失败。这两个项目都引用了相同版本的 System.Reactive nuget 包 (4.3.1)。

如果我使用更弱类型的 FromEventPattern 版本(没有 TViewModel),然后手动Select进入EventPattern<PropertyChangedEventArgs>EventPattern<TViewModel, PropertyChangedEventArgs>它在两个项目中都可以正常工作。但我不应该那样做。

我做错了什么,或者这是 Rx 中的错误?异常的调用栈如下:

mscorlib.dll!System.Delegate.CreateDelegate(System.Type type, object firstArgument, System.Reflection.MethodInfo method, bool throwOnBindFailure)   Unknown
mscorlib.dll!System.Delegate.CreateDelegate(System.Type type, object firstArgument, System.Reflection.MethodInfo method)    Unknown
System.Reactive.dll!System.Reactive.ReflectionUtils.CreateDelegate<System.ComponentModel.PropertyChangedEventHandler>(object o, System.Reflection.MethodInfo method) Line 24    C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.EventProducer<System.ComponentModel.PropertyChangedEventHandler, System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>.Session.Initialize() Line 323   C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.EventProducer<System.ComponentModel.PropertyChangedEventHandler, System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>.Session.Connect(System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>> observer = {System.Reactive.AnonymousSafeObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>}) Line 269 C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.EventProducer<System.ComponentModel.PropertyChangedEventHandler, System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>.Run(System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>> observer) Line 228  C#
System.Reactive.dll!System.Reactive.BasicProducer<System.__Canon>.SubscribeRaw.AnonymousMethod__1_0((System.Reactive.BasicProducer<System.__Canon> this, System.Reactive.Disposables.SingleAssignmentDisposable runAssignable, System.IObserver<System.__Canon> observer) tuple) Line 60    C#
System.Reactive.dll!System.Reactive.Concurrency.Scheduler.ScheduleAction.AnonymousMethod__76_0(System.Reactive.Concurrency.IScheduler _, (System.Func<(System.__Canon, System.__Canon, System.__Canon), System.IDisposable> action, (System.__Canon, System.__Canon, System.__Canon) state) tuple) Line 88  C#
System.Reactive.dll!System.Reactive.Concurrency.CurrentThreadScheduler.Schedule<System.ValueTuple<System.Func<(System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>), System.IDisposable>, (System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>)>>((System.Func<(System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>), System.IDisposable>, (System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>)) state, System.TimeSpan dueTime, System.Func<System.Reactive.Concurrency.IScheduler, (System.Func<(System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>), System.IDisposable>, (System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>)), System.IDisposable> action) Line 101 C#
System.Reactive.dll!System.Reactive.Concurrency.LocalScheduler.Schedule<System.ValueTuple<System.Func<(System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>), System.IDisposable>, (System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>)>>((System.Func<(System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>), System.IDisposable>, (System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>)) state, System.Func<System.Reactive.Concurrency.IScheduler, (System.Func<(System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>), System.IDisposable>, (System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>)), System.IDisposable> action) Line 32   C#
System.Reactive.dll!System.Reactive.Concurrency.Scheduler.ScheduleAction<System.ValueTuple<System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>>>(System.Reactive.Concurrency.IScheduler scheduler, (System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>) state, System.Func<(System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>, System.Reactive.Disposables.SingleAssignmentDisposable, System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>), System.IDisposable> action) Line 86    C#
System.Reactive.dll!System.Reactive.BasicProducer<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>>.SubscribeRaw(System.IObserver<System.Reactive.EventPattern<MyViewModel, System.ComponentModel.PropertyChangedEventArgs>> observer, bool enableSafeguard) Line 62   C#
4

0 回答 0