C#排序类型层次结构

时间:2015-07-17 16:53:45

标签: c# reflection

我有多个类型存储在列表中,我需要将它们从最具体的类型排序到最常见的类型,例如:

Vehicle
  Car
  Bike

Person
  Manager
  Programmer

所以它列表:车辆,汽车,自行车,人,经理,程序员类型。现在我需要得到有序列表,其中更具体的类型总是在更一般的类型之前,如:汽车,自行车,车辆,经理,程序员,人。有没有一些简单/优雅的方法来实现这一点,除了一些体操与Type.IsAssignableFrom?

2 个答案:

答案 0 :(得分:3)

一种简单的方法是确定每个子类在其层次结构中必须有比其父类更多的类,因此您可以按每种类型的层次结构中的多少个类进行排序:

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{}

答案 1 :(得分:0)

正如Adam Pointed和Jashaszun所说,你需要一个公共字段来设置类型类的优先级,因为Car和Bike在继承中都处于同一级别,你必须决定哪个具有最高优先级。

在这种情况下,如果您拥有同一个集合中的所有类,并且这些类可以从不同的根类型(车辆或人)继承 您可以使用属性优先级整数定义接口IPrioritySort,并为每个不同的类设置值(如果某个类型的所有对象都相同,则可以是静态的),并使用它对您的集合进行排序。

如果你用这个来解释你将会达到什么目的,以便了解解决方案是否符合我们的想法或是否还有别的东西,那将是很好的。