Как создать IObservable из делегата? - PullRequest
0 голосов
/ 02 июня 2019

Этот код:

// NOTE: IQuote DOES NOT inherit from EventArgs
public interface IQuote// : EventArgs
{
}

class C
{
   //NOTE, this is NOT public event EventHandler<IQuote> QuoteChangeEvent;
    public delegate void QuoteChangeEvent(IQuote q);
}

var c = new C();

c.OnQuoteChange += ProcessQuoteChange;


public static void ProcessQuoteChange(IQuote q)
{
}

отлично работает.Теперь я хочу использовать Rx.Это не работает, то есть даже не компилируется:

var priceChangedObservable = Observable.FromEvent<QuoteChangeEvent, QuoteChangeEvent>(
    (handler) =>
    {
        QuoteChangeEvent quoteHandler = (e) => handler(e);                   
    },
    eh => c.OnQuoteChange += eh,
    eh => c.OnQuoteChange -= eh
    );

На линии (handler) =>

- "Severity Code    Description Project File    Line    Suppression State   
   Error    CS1643  Not all code paths return a value in lambda expression  
   of type 'Func<Action<QuoteChangeEvent>,   
   QuoteChangeEvent>'       294 Active"

На handler(e)

Ошибка CS1503 Аргумент 1: невозможно преобразовать из 'IQuote' в 'QuoteChangeEvent' 296 Активно

Как правильно создать IObservable из delegate?

1 Ответ

2 голосов
/ 02 июня 2019

При использовании Observable.FromEvent<TDelegate, TEventArgs> вы должны передать <QuoteChangeEvent, IQuote>:

var priceChangedObservable = Observable.FromEvent<QuoteChangeEvent, IQuote>(
    handler =>
    {
        QuoteChangeEvent quoteHandler = (e) => { handler(e); }; 
        return quoteHandler;         
    },
    eh => c.OnQuoteChange += eh,
    eh => c.OnQuoteChange -= eh
);

...