泛型列表中的 is 运算符
本文关键字:is 运算符 列表 泛型 | 更新日期: 2023-09-27 18:25:18
interface IVehicle
{
void DoSth();
}
class VW : IVehicle
{
public virtual void DoSth() { ... }
}
class Golf : VW { }
class Lupo : VW
{
public override void DoSth()
{
base.DoSth();
...
}
}
在我的代码中,我有:
List<VW> myCars = new List<VW>();
myCars.Add(new Golf());
myCars.Add(new Lupo());
现在我想评估我是否有车辆列表。 像这样:
if(myCars is List<IVehicle>)
{
foreach(IVehicle v in myCars)
v.DoSth();
}
我该怎么做? 泛型列表中的 is 运算符不起作用。还有其他方法吗?
即使有 4.0 方差规则,大众列表也永远不会是 IVehicle 列表,即使 VW 是 IVehicle。这不是方差的工作原理。
但是,在 4.0 中,您可以使用:
var vehicles = myCars as IEnumerable<IVehicle>;
if(vehicles != null) {
foreach(var vehicle in vehicles) {...}
}
由于IEnumerable<out T>
表现出协方差。
在 .net 4 中,可以使用泛型参数方差。在此处阅读更多相关信息
你可以
这样做:
if (typeof(IVehicle).IsAssignableFrom(myCars.GetType().GetGenericArguments[0]))
foreach (IVehicle v in myCars)
//...
这假设您知道 myCars 是一种泛型类型。 如果您不确定,则需要先进行一两次额外的检查。
但是,由于您没有使用除 GetEnumerator 之外的任何列表成员,因此您可以执行以下操作:
if (myCars is IEnumerable<IVehicle>) //...