如何检查继承通用接口的类的不同实例的列表

时间:2013-11-23 16:06:27

标签: c# generics reflection

我有List<ICar<T>>辆汽车。我想将新的ICar<T> Honda添加到列表中,只有它本身不存在。结构如下:

class Honda : IHonda{}
interface IHonda : ICar<T>

class Ford  : IFord{}
interface IFord  : ICar<T>

我只想将每种类型的汽车中的一种放入列表中,但只知道它们是ICar<T>。我提前不知道可能的汽车清单。怎么办呢?

我在想像

这样的东西
cars.Any(i => i.GetType().GetInterfaces().Contains(
                    car
                    .GetType()
                    .GetInterfaces()
                    .Where(s =>!cars.GetType().GenericTypeArguments != s.GenericTypeArguments
))))

然而,有些事情是错的,我无法通过这个看到一条路径。

4 个答案:

答案 0 :(得分:1)

如果您的Type实例对应T,则可以使用:

Type t = //
Type carType = typeof(ICar<>).MakeGenericType(t);
bool exists = cars.Any(c => carType.IsAssignableFrom(c.GetType()));

答案 1 :(得分:1)

我认为您可以使用

 //get list of all interfaces in the currrent car list
 //you will have to check the contents of yourList as it may contain some types 
 //such as IList / IEnumerable that you will want to filter out.
 var yourList =  list.SelectMany(car => car.GetType().GetInterfaces());

 //check get all interfaces on your car and check if the list contains it
 bool exists = yourCar.GetType().GetInterfaces().Any(c => yourList.Contains(c));

答案 2 :(得分:1)

您可以使用类型的完全限定名称来比较元素。

CarTypeComparer compareCarTypes = new CarTypeComparer();

if (!List.contains(car, compareCarTypes))
{
   // insert car into list
}

class CarTypeComparer : IEqualityComparer<ICar<T>>
{
   public bool Equals(ICar<T> car1, ICar<T> car2)
   {
      if (car1.GetType().FullName == car2.GetType().Fullname)
      {
          return true;
      }
      else 
      {
          return false;
      }

   }
   // implement GetHashCode() ....
}

答案 3 :(得分:0)

在ICar界面中添加CarModel属性,然后在您的类中实现它。例如在Honda类中:

public string CarModel { get { return "Honda"; } }

你可以查询你的查询中的CarModel属性,当然你可以通过CarModel对你的车进行分组,我希望这有帮助。