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-operator不起作用。还有另一种方式吗?
答案 0 :(得分:11)
即使使用4.0方差规则,即使VW是IVehicle,大众列表也不会是IVehicle列表。这不是方差的工作方式。
但是,在4.0中,您可以使用:
var vehicles = myCars as IEnumerable<IVehicle>;
if(vehicles != null) {
foreach(var vehicle in vehicles) {...}
}
由于IEnumerable<out T>
表现出协方差。
答案 1 :(得分:2)
在.net 4中,可以使用通用参数方差。详细了解here
答案 2 :(得分:0)
你可以这样做:
if (typeof(IVehicle).IsAssignableFrom(myCars.GetType().GetGenericArguments[0]))
foreach (IVehicle v in myCars)
//...
这假设您知道myCars是通用类型。如果您不确定,那么您需要先进行一两次检查。
但是,由于您没有使用GetEnumerator以外的任何列表成员,您可以这样做:
if (myCars is IEnumerable<IVehicle>) //...