Rx.是否有一种优雅的方式来创建可观察对象从回调,这是传递给行动者



我有这样的代码

using System.Reactive.Linq;
var wrapper = new Wrapper<int>();
var clicker = new Clicker(wrapper.Action);
Observable
.FromEvent
(
(Action<int> f) => wrapper.RegisterCallback(f),
f => wrapper.UnregisterCallback(f)
)
.Subscribe(Console.WriteLine);
clicker.Click(7);
clicker.Click(2);
clicker.Click(5);
public class Clicker
{
private readonly Action<int> _callback;
public Clicker(Action<int> callback)
{
_callback = callback;
}
public void Click(int val)
{
_callback(val);
}
}
public class Wrapper<T>
{
private readonly List<Action<T>> _callbacks = new();
public void RegisterCallback(Action<T> callback) => _callbacks.Add(callback);
public void UnregisterCallback(Action<T> callback) => _callbacks.Remove(callback);
public void Action(T val) => _callbacks.ForEach(f => f(val));
}

,我需要在Clicker中创建一个响应Click调用的可观察对象。中传递回调. 有没有其他实现而不需要实现包装器类的方法?.

你的类试图复制委托和可观察对象的基本功能…

public class Clicker : ISubject<int>
{
private readonly Subject<int> subject = new Subject<int>();
public void Click(int val)
{
subject.OnNext(val);
}
public void OnCompleted() => subject.OnCompleted();
public void OnError(Exception error) => subject.OnError(error);
public void OnNext(int value) => subject.OnNext(value);
public IDisposable Subscribe(IObserver<int> observer) => subject.Subscribe(observer);
public IDisposable Subscribe(Action<int> onNext) => subject.Subscribe(onNext);
}
var clicker = new Clicker();
clicker.Subscribe(callback); // subscribe using the callback
clicker.Click(7);
clicker.Click(2);
clicker.Click(5);
clicker.OnNext(7); // equivalent
clicker.OnNext(2);
clicker.OnNext(5);

如果你一定要保留这些类,创建一个主题来代替clicker实例。

var subject = new Subject<int>();
var clicker = new Clicker(subject.OnNext);

subject.Subscribe(callback);
subject.OnNext(7);
clicker.Click(7); // equivalent

最新更新