Observable.AsObservable<TSource>で、IObservable<TSource>にキャストできる。
Observable.AsObservable(TSource) Method (System.Reactive.Linq) | Microsoft Docs
Reactive Extensions再入門 その3「IObservableのファクトリメソッド」 - かずきのBlog@hatena
【Unity】AsObservable()メソッドについて【UniRx】 - Qiita
Subject<T>は、IObservable<T>を実装しているので、これでキャストする必要ないように感じるかもしれないが、これはSubject<T>に戻されたくない場合に使う。
普通のキャストなら元に戻せるので、
x = 1 x = 2 Complete. 続行するには何かキーを押してください . . .
こうなるが、AsObservableを使うと、
using System; using System.Collections.Generic; using System.Linq; using System.Reactive.Linq; using System.Reactive.Subjects; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Observable_ { class Program { // メインメソッド static void Main(string[] args) { // Subjectの生成. Subject<int> subject = new Subject<int>(); // int型のSubjectオブジェクトsubjectを生成. // 登録. subject.Subscribe(x => Console.WriteLine("x = " + x), ex => Console.WriteLine("ex.Message" + ex.Message), () => Console.WriteLine("Complete.")); // 値の通知, エラー処理, 完了通知をセット. // 発行. subject.OnNext(1); // 1を発行. // IObservable<int>にキャスト. IObservable<int> observable = subject.AsObservable(); // Object.AsObservableでSubect<int>からIObservable<int>にキャスト. // 元に戻す. Subject<int> subject2 = (Subject<int>)observable; // IObservable<int>からSubect<int>にキャスト. // subject2で発行. subject2.OnNext(2); // 2を発行. // 完了. subject.OnCompleted(); // 完了を通知. // 解除. subject.Dispose(); // 解除. } } }
とした時に、
x = 1 ハンドルされていない例外: System.InvalidCastException: 型 'System.Reactive.Linq.ObservableImpl.AsObservable`1[System.Int32]' のオブジェクトを型 'System.Reactive.Subjects.Subject`1[System.Int32]' にキャストできません。 場所 Observable_.Program.Main(String[] args) 場所 C:\Project\Cloud\github.com\Sample\rx\Observable\AsObservable_TSource\src\Observable_\Observable_\Program.cs:行 30 続行するには何かキーを押してください . . .
キャストできないという例外が出る。
このようにダウンキャストして欲しくない時に使う。
Sample/rx/Observable/AsObservable_TSource/src/Observable_ at master · bg1bgst333/Sample · GitHub