将一个Observable映射到UniRX中另一个不同类型的Observable

时间:2016-06-05 19:04:49

标签: c# unity3d reactive-programming

我使用UniRX插件在C#中使用Unity工作。对于那些不熟悉它的人来说,UniRX是一个C#Reactive扩展的实现,它被移植回C#.Net 2(这是Unity在5.3.5版本中使用的)。 我想要做的是从A类型的一个IObservable中获取数据,使用System.Func转换它,并自动将结果发布到B类型的新IObservable中。我写了几行代码来做到这一点但是我觉得这应该只是自动包含在Reactive扩展中的东西(但我无法找到在文档中调用的正确方法)。 我写的代码如下:

private class ObserverableBridge<TIn, TOut> {
    public ReactiveProperty<TOut> outStream;

    public ObserverableBridge(IObservable<TIn> input, System.Func<TIn, TOut> converter) {
        this.outStream = new ReactiveProperty<TOut>();
        input.Subscribe((inValue) => this.outStream.Value = converter(inValue));
    }
}

public static IObservable<TOut> Bridge<TIn, TOut>(this IObservable<TIn> a, System.Func<TIn, TOut> converter) {
    return new ObserverableBridge<TIn, TOut>(a, converter).outStream;
}

可以使用如下:

        ReactiveProperty<float> input = new ReactiveProperty<float>(0.1f);
        IObservable <int> output = input.Bridge((inFloat) => Mathf.RoundToInt(inFloat));
        output.Subscribe((a) => { Debug.Log("a = " + a); });
        for(int i = 1; i<3; i++) {
            input.Value = i + 0.1f;
        }

并产生如下输出:

a = 0
a = 1
a = 2

我感到好奇的是有一种方法可以在Reactive Extension中构建这种方法(在我看来应该这样),这样我就不需要使用自己的Bridge系统。

预先感谢您的协助!

1 个答案:

答案 0 :(得分:0)

尝试Select()

ReactiveProperty<float> input = new ReactiveProperty<float>(0.1f);
input.Select<float, int>(Mathf.RoundToInt).Subscribe(a => Debug.LogFormat("a = {0}", a));