假设我们有一个基类 A 和 2 个派生类 B 和 C。如果我想查询以字符串形式给出的某种类型的实例,我该怎么做?
我想写:
var q = A.OfType<t == "B" ? B : C>()
但这不会编译,我真的不想写两个不同的查询:
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# 中为此语句使用三元运算符)