我有这样的代码
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