Как мне создать Observable из действия <T>? - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь создать Observable из Action, но синтаксис FromEventPattern и FromEvent мне сложно обернуть.

Вот моя попытка:

Observable
    .FromEventPattern<Action<IStreamTrade>, IStreamTrade>(
        x => _polygonSocket.TradeReceived += x,
        x => _polygonSocket.TradeReceived -= x)
    .Select(x => x?.EventArgs)
    .IsNotNull()
    .Subscribe( /** do stuff **/)
    .DisposeWith(Bindings);

Я чувствую, что FromEventPattern может быть неправильным выбором, но я не могу заставить что-либо компилировать.

Что происходит:

Я получаю Parameter count mismatch. исключение, которое выглядит так:

Parameter count mismatch.
Thread started:  #26
  at System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method, System.Boolean throwOnBindFailure, System.Boolean allowClosed) [0x000ee] in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/external/mono/mcs/class/corlib/System/Delegate.cs:230 
  at System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method) [0x00000] in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/external/mono/mcs/class/corlib/System/Delegate.cs:296 
  at System.Reactive.ReflectionUtils.CreateDelegate[TDelegate] (System.Object o, System.Reflection.MethodInfo method) [0x00000] in <370f6a6bb34048878534065376a195cb>:0 
  at System.Reactive.Linq.ObservableImpl.FromEventPattern+Impl`2[TDelegate,TEventArgs].GetHandler (System.Action`1[T] onNext) [0x0003d] in <370f6a6bb34048878534065376a195cb>:0 
  at System.Reactive.Linq.ObservableImpl.EventProducer`2+Session[TDelegate,TArgs].Initialize () [0x00023] in <370f6a6bb34048878534065376a195cb>:0 
  at System.Reactive.Linq.ObservableImpl.EventProducer`2+Session[TDelegate,TArgs].Connect (System.IObserver`1[T] observer) [0x00033] in <370f6a6bb34048878534065376a195cb>:0 

Что яищу:

Я хотел бы узнать, как создать Observable из Action<IStreamTrade>.Я открыт для решения с использованием Observable.Create, но предпочел бы решения с использованием FromEvent или FromEventPattern, если это вообще возможно.

Некоторая дополнительная информация:

Вот как определяется действие:

public event Action<IStreamTrade> TradeReceived;

Источник GitHub

И вот как они используют его в своем примере кода:

sockClient.OnTradeUpdate += HandleTradeUpdate;

// later ...

private void HandleTradeUpdate(ITradeUpdate trade)
{
// removed irrelevant code
}

Источник GitHub

1 Ответ

2 голосов
/ 28 сентября 2019

Попробуйте использовать Observable.FromEvent, который преобразует общее событие .NET на основе Action в наблюдаемую последовательность:

Observable.FromEvent<IStreamTrade>(
    x => _polygonSocket.TradeReceived += x,
    x => _polygonSocket.TradeReceived -= x)
.Subscribe( /** do stuff **/)
.DisposeWith(Bindings);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...