通用列表上的is-operator

时间:2012-02-19 20:01:05

标签: c# .net list generics inheritance

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不起作用。还有另一种方式吗?

3 个答案:

答案 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>) //...