基本クラス A と 2 つの派生クラス B および C があるとします。文字列として指定された特定の型のインスタンスを照会したい場合、どのようにすればよいでしょうか?
私は書きたい:
var q = A.OfType<t == "B" ? B : C>()
しかし、それはコンパイルされず、2 つの異なるクエリを書きたくありません。
var q;
if (t == "A") q = A.OfType<B>();
else q = A.OfType<C>();
誰か提案?
私が思いついた最も近いものは次のとおりです。
var q = a.Where(e => (t == "B" && e is B) || (t != "B" && e is C));
コメントのjodsによって部分的に提案された別の可能性:
var q = t == "B"
? ((IEnumerable<A>)a.OfType<B>())
: ((IEnumerable<A>)a.OfType<C>());
ただし、どちらの場合も、結果は<A>
コンパイル時に決定する必要があるため、実行時の条件に依存する関数の戻り値の型を持つことができないため、型になります。
まさにあなたが望むものではありませんが、三項演算子 (?:) は美しいものです。
var q = (t=="B") ? A.OfType<B>() : A.OfType<C>() ;
( c# でこのステートメントに三項演算子を使用する方法を参照してください)