简体   繁体   English

如何从委托创建IObservable?

[英]How to create IObservable from delegate?

This code: 这段代码:

// 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)
{
}

works fine. 工作正常。 Now I want to use Rx . 现在我想使用Rx This doesn't work, ie, it doesn't even compile: 这是行不通的,即甚至无法编译:

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

On the line (handler) => 上线(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"

On the handler(e) handler(e)

Error CS1503 Argument 1: cannot convert from 'IQuote' to 'QuoteChangeEvent' 296 Active 错误CS1503参数1:无法从“ IQuote”转换为“ QuoteChangeEvent” 296有效

What is the correct way to create an IObservable from a delegate ? delegate创建IObservable的正确方法是什么?

When using Observable.FromEvent<TDelegate, TEventArgs> , you should pass <QuoteChangeEvent, IQuote> : 使用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
);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM