我有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
))))
然而,有些事情是错的,我无法通过这个看到一条路径。
答案 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对你的车进行分组,我希望这有帮助。