2016-06-05 3 views
3

Ich arbeite in Unity in C# mit dem UniRX-Plugin. Für diejenigen, die sich nicht damit auskennen, ist UniRX eine Implementierung der C# -Reactive-Erweiterung, die zurück in C# .Net 2 portiert wurde (was die Einheit ab Version 5.3.5 verwendet). Was ich versuche zu tun ist, nehmen Daten von einem IObservable in Typ A konvertieren Sie es mit einem System.Func und automatisch das Ergebnis in einem neuen IObservable von Typ B. Ich schrieb ein paar Zeilen Code, um dies zu tun, aber ich fühle So etwas sollte nur automatisch in der Reactive-Erweiterung enthalten sein (aber ich konnte einfach nicht die richtige Methode finden, um die Dokumentation aufzurufen). Der Code I schrieb wie folgt:Zuordnung eines Observable zu einem anderen Observable eines anderen Typs in UniRX

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; 
} 

, die wie folgt verwendet werden:

 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; 
     } 

und erzeugt eine Ausgabe wie:

a = 0 
a = 1 
a = 2 

Was ich bin neugierig, ist es eine Möglichkeit, dies in die Reactive Extension eingebaut zu haben (scheint mir, als sollte es sein), so dass ich kein eigenes Brückensystem verwenden muss.

Vielen Dank im Voraus für Ihre Unterstützung!

Antwort

0

Versuchen Select():

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