過去記事インデックス
- Reactive Extensions再入門 その1
- Reactive Extensions再入門 その2「IObservableインターフェースとIObserverインターフェース」
- Reactive Extensions再入門 その3「IObservableのファクトリメソッド」
- Reactive Extensions再入門 その4「Timer系のファクトリメソッド」
- Reactive Extensions再入門 その5「HotとCold」
- Reactive Extensions再入門 その6「HotなIObservableを作成するファクトリ」
- Reactive Extensions再入門 その7「LINQスタイルの拡張メソッド」
- Reactive Extensions再入門 その8「SkipとTakeメソッド」
- Reactive Extensions再入門 その9「Skip + Take + Repeat = ドラッグ」
- Reactive Extensions再入門 その10「Doメソッド」
- Reactive Extensions再入門 その11「Catchメソッド」
- Reactive Extensions再入門 その12「Finallyメソッドとリソース解放」
- Reactive Extensions再入門 その13「最後の値を取得するLatestとMostRecentメソッド」
- Reactive Extensions再入門 その14「Nextメソッド」
- Reactive Extensions再入門 その15「To*****系メソッド」
- Reactive Extensions再入門 その16「最大、最少、平均を求めるメソッド」
- Reactive Extensions再入門 その17「集計するメソッド」
- Reactive Extensions再入門 その18「CountメソッドとLongCountメソッド」
- Reactive Extensions再入門 その19「AnyメソッドとAllメソッド」
- Reactive Extensions再入門 その20「GroupByメソッドでグルーピングしてみよう」
- Reactive Extensions再入門 その21「GroupByUntilメソッド」
- Reactive Extensions再入門 その22「単一の値を取得するメソッド」
- Reactive Extensions再入門 その23「重複を排除するメソッド」
- Reactive Extensions再入門 その24「単一の値を取得するメソッド その2」
- Reactive Extensions再入門 その25「値をまとめるBufferメソッド」
- Reactive Extensions再入門 その26「値をまとめるWindowメソッド」
- Reactive Extensions再入門 その27「時間でフィルタリング?Sampleメソッド」
- Reactive Extensions再入門 その28「落ち着いたら流すThrottleメソッド」
- Reactive Extensions再入門 その29「値を指定した時間だけ遅延させるDelayメソッド」
- Reactive Extensions再入門 その30「もう待ちきれない!を表現するTimeoutメソッド」
- Reactive Extensions再入門 その31「時間に関する情報を付与するTimestampとTimeIntervalメソッド」
はじめに
今回は型変換です!
型変換を行う拡張メソッド
ここでは、IObservable
Castメソッド
ここではCastメソッドについて説明します。Castメソッドは名前の通り、もとになるIObservable
public static IObservable<T> Cast<T>(this IObservable<object> source);
このメソッドの使用例を下記に示します。
var source = new Subject<object>(); source // 値をint型にキャスト .Cast<int>() // 購読 .Subscribe( i => Console.WriteLine("OnNext({0})", i), ex => Console.WriteLine("OnError({0})", ex), () => Console.WriteLine("OnCompleted()")); // int型の値を発行 source.OnNext(1); source.OnNext(2); source.OnNext(3); // 文字列型を発行してみる source.OnNext("abc");
Castメソッドを使ってobject型からint型に変換してSubscribeで購読しています。そして、1〜3の値を発行したあとに文字列型の”abc”を発行しています。実行結果を以下に示します。
OnNext(1) OnNext(2) OnNext(3) OnError(System.InvalidCastException: 指定されたキャストは有効ではありません。 場所 System.Reactive.Linq.Observable.<Cast>b__46e[TResult](Object x) 場所 System.Reactive.Linq.Observable.<>c__DisplayClass408`2.<>c__DisplayClass 40a.<Select>b__407(TSource x))
実行結果からわかる通り、文字列型を発行するとInvalidCastExceptionが発行されてOnErrorに処理がいっていることが確認できます。このようにCastメソッドは、あくまで単純なキャストを行うためのメソッドであることがわかります。
OfTypeメソッド
ここでは、OfTypeメソッドについて説明します。OfTypeメソッドは、もとになるIObservable
public static IObservable<T> OfType<T>(this IObservable<object> source);
このメソッドのコード例を下記に示します。
var source = new Subject<object>(); source // int型のみを通過させる .OfType<int>() // 購読 .Subscribe( i => Console.WriteLine("OnNext({0})", i), ex => Console.WriteLine("OnError({0})", ex), () => Console.WriteLine("OnCompleted()")); // int型の値を発行 source.OnNext(1); source.OnNext(2); source.OnNext(3); // 文字列型を発行してみる source.OnNext("abc"); source.OnNext("4"); // もう一度int型の値を発行して終了 source.OnNext(100); source.OnCompleted();
OfTypeメソッドを使って、1〜3の値が発行されたあと文字列型で”abc”と”4”が発行されて、100が発行されるシーケンスをフィルタリングして、購読しています。実行結果を以下に示します。
OnNext(1) OnNext(2) OnNext(3) OnNext(100) OnCompleted()
Castメソッドとは異なり、文字列型が発行されても例外は発生しません。単純に後続に値が流れることなくフィルタリングされます。