如何在C#和System.Reactive中将基于事件的类替换为基于可观察的类?

问题描述

我有一堂课,上面有一些事件。目前,由于他们提出的好处,我决定转向“可观察的”。为了实现此目标,我引入了一个Observable属性,将其替换为事件之一。接下来,我将事件设置为“私有”,以限制类之外的访问。需要时,该事件在类内部使用函数进行调用。但是,我认为这样做可能是更好的方法。正确的做法是什么?顺便说一下,我是“ System.Reactive”的新手,所以如果我对该概念有误解,请澄清此事。我的代码如下:

public class MyClass
{
    public MyClass()
    {
        informationSenderObservable=Observable.FromEventPattern<SolutionEventArg>(ev =>informationSender += ev,ev => informationSender -= ev);
    }
    private event EventHandler<SolutionEventArg> informationSender;
    public IObservable<EventPattern<SolutionEventArg>> informationSenderObservable { get; }

    internal void DoSomething()
    {
        // long calculation
        Sendinformation();
    }

    private void Sendinformation()
    {
        informationSender?.Invoke(this,new SolutionEventArg()
            {
                InfoProxyData = GetDetailsForBestCompressedData(),ParallelProcess = parallelProcessing
            });
    }
}

解决方法

多亏了西奥多·佐里亚斯(Theodor Zoulias),我终于了解到如何更好地处理我的课。我使用ISubject<T> 代替班级中的事件将信息从班级发送到另一个预订ISubject<T>的班级。

public class MyClass
    {
        public MyClass()
        {
            InformationSenderObservable=new Subject<SolutionEventArg>();
        }
        
        public ISubject<SolutionEventArg> InformationSenderObservable { get; }

        internal void DoSomething()
        {
            // long calculation
            SendInformation();
        }

        private void SendInformation()
        {
            try
            {
                InformationSenderObservable.OnNext(new SolutionEventArg()
                {
                    InfoProxyData = GetDetailsForBestCompressedData(),ParallelProcess = parallelProcessing
                });
            }
            catch (Exception e)
            {
                InformationSenderObservable.OnError(e);
            }
        }
    }

ISubject<T>同时实现IObservable<T>IObserver<T>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...