我有一个存储在列表中的多种类型,我需要将它们按照从最具体的类型到最一般的类型进行排序,例如:
Vehicle
Car
Bike
Person
Manager
Programmer
因此,它使用车辆、汽车、自行车、人、经理和程序员等类型进行列表。现在我需要获得排序列表,其中更具体的类型始终在更一般的类型之前,如:汽车、自行车、车辆、经理、程序员、人。是否有一些简单/优雅的方法来实现这一点,而不是通过Type.IsAssignableFrom进行某些高难度操作?
我有一个存储在列表中的多种类型,我需要将它们按照从最具体的类型到最一般的类型进行排序,例如:
Vehicle
Car
Bike
Person
Manager
Programmer
因此,它使用车辆、汽车、自行车、人、经理和程序员等类型进行列表。现在我需要获得排序列表,其中更具体的类型始终在更一般的类型之前,如:汽车、自行车、车辆、经理、程序员、人。是否有一些简单/优雅的方法来实现这一点,而不是通过Type.IsAssignableFrom进行某些高难度操作?
var types = new[] {
typeof(Vehicle),
typeof(Car),
typeof(Bike),
typeof(Person),
typeof(Manager),
typeof(Programmer)
};
var ordered = types.OrderByDescending(t => GetHierarchy(t).Count());
使用这个:
private static IEnumerable<Type> GetHierarchy(Type type)
{
while (type != null) {
yield return type;
type = type.BaseType;
}
}
class Vehicle {}
class Car : Vehicle{}
class Bike : Vehicle{}
class Person {}
class Manager : Person{}
class Programmer : Person{}
正如Adam Pointed和Jashaszun所说,您需要一个公共字段来设置类型类的优先级,因为Car和Bike在继承中处于同一级别,您必须决定哪个具有最高优先级。
在这种情况下,如果您将所有类放在同一集合中,并且这些类可以从不同的根类型(车辆或人员)继承,则可以定义一个名为IPrioritySort的接口,其中包含一个名为Priority Integer的属性,并为每个不同的类设置值(如果它对某种类型的所有对象都相同,则可以是静态的),并使用它来对集合进行排序。
如果您解释一下您将通过此方法实现什么,那将很好,以便我们了解解决方案是否符合我们的想法,或者是否还有其他问题。
Vehicle
和Person
?为什么你的示例结果中Vehicle
排在首位? - Jashaszun