Skip to content

OfType

1. 概要

OfType は、上流から流れてくる値のうち、指定した型 TResult に一致するものだけを フィルタリングしてキャスト するオペレーターです。

型が一致しない値は単にスキップされ、エラーにはなりません。内部的には value is TResult による型チェックを行い、一致した値だけを下流へ流します。

2. シグネチャ

指定した型に一致する値だけを通す

csharp
public static Observable<TResult> OfType<T, TResult>(this Observable<T> source)

上流の各値に対して is TResult で型チェックを行い、一致する値だけを TResult として下流へ流します。

csharp
source.OfType<object, string>()

3. マーブルダイアグラム

OfType のマーブルダイアグラム

上流から複数の型の値が流れてきた場合、指定した型に一致する値だけが下流へ流れ、一致しない値はスキップされます。

4. サンプルコード

csharp
using R3;

// object 型の Observable から string だけを抽出
Observable<object> source = Observable.Create<object>(observer =>
{
    observer.OnNext("Hello");
    observer.OnNext(42);
    observer.OnNext("World");
    observer.OnNext(3.14);
    observer.OnCompleted();
    return Disposable.Empty;
});

source.OfType<object, string>()
    .Subscribe(x => Console.WriteLine(x));
// 出力: Hello, World
// (42 と 3.14 はスキップされる)

5. 補足

  • Cast はすべての値をキャストし、型が一致しない場合は 例外をスロー します。一方、OfType は型が一致しない値を 静かにスキップ します。型の混在が想定される場合は OfType、すべての値が確実に指定した型であると分かっている場合は Cast を使ってください。
  • OfType は変換とフィルタリングの両方を行うため、Where + Cast の組み合わせを 1 つのオペレーターで実現できます。