タイプパラメータを使用するのではなく、タイプインスタンスの引数として希望のタイプを指定する代わりにOfTypeの代替を実装しようとしていますが、それを実装することです。これは私がこれまで持っているものです。Enumerable.OfTypeを実装するTypeインスタンスの引数を持つ<T>を実装する
public static IEnumerable<T> OfType<T>(this IEnumerable<T> enumerable, Type type)
{
return enumerable.Where(element => type.IsInstanceOfType(element));
}
私は最初に以下のコードで始まったが、それは継承をサポートしません実現...
public static IEnumerable<T> OfType<T>(this IEnumerable<T> enumerable, Type type)
{
return enumerable.Where(element => element.GetType() == type);
}
それから私はのためのベースタイプを比較することについて考えおそらく悪い考えであると思う前に数秒。
私の質問は、指定された型が同じである場合、常にOfTypeと同じ結果を返します。つまり、下のコード例のparametrizedFiltered
とtypeInstanceFiltered
のコレクションには同じ要素が含まれていますか?
IEnumerable<InterfaceType> someCollection = BlackBox.GetCollection();
IEnumerable<DerivedType> parametrizedFiltered = someCollection.OfType<DerivedType>();
IEnumerable<InterfaceType> typeInstanceFiltered = someCollection.OfType(typeof(DerivedType));
あなたは「深い」継承してチェックするためのIsAssignableFrom' 'を見てかかることがあります。 –
@ JeroenvanLangen 'IsAssignableFrom(x.GetType())'は 'null'の場合を無視すると' IsInstanceOfType(x) 'と同等です。 IsAssignableFromの結果をキャッシュすると、パフォーマンスが向上する可能性があります。 – CodesInChaos
配列の共分散型とNULL値型の型は同じです。インタフェースの共分散も同様に機能するはずです。 – CodesInChaos