从Assembly.GetTypes()获取的类型的排序

时间:2013-12-28 16:28:03

标签: c# reflection

我有一个要求,我需要获得以下类型

public class Class1
{
}

public class Class2 : Class1
{
}

public class Class3 : Class1
{
}

我可以在目标程序集上调用Assembly.GetTypes()并添加从Class1派生的所有类。我订购类型,以便下次使用该订单。 该顺序对于内部序列化和反序列化至关重要,因为内部引擎依赖于类型的索引而不是类型名称。我无法改变序列化引擎。

如果以后新的Class4派生自Class1,那么它应该在Class3之后的顺序。

我无法想到一个可行的解决方案。

是的,我需要维护一个xml文件,其中保存了类型的顺序,如果遇到新类型,是否应该在xml的末尾添加?

请帮忙

1 个答案:

答案 0 :(得分:1)

您可以为订购创建任何自定义规则:例如。模式为{ClassName}{Index}

    [Fact]
    public void Test()
    {

        Type baseClass = typeof(Class1);
        var result = (from type in Assembly.GetExecutingAssembly().GetTypes()
                      where type.IsSubclassOf(baseClass)
                      let index = Regex.Match(type.Name, @"\d+$")
                      where string.IsNullOrWhiteSpace(index.Value) == false
                      select new ResultItem { Index = int.Parse(index.Value), Type = type })
                      .OrderBy(x=>x.Index)
                      .ToList();
        result.ForEach(Console.WriteLine);
    }

    public class Class1
    {
    }

    public class Class2 : Class1
    {
    }

    public class Class3 : Class1
    {
    }

    private sealed class ResultItem
    {
        public int Index { get; set; }
        public Type Type { get; set; }

        public override string ToString()
        {
            return string.Format("Index: {0}, Type: {1}", Index, Type.Name);
        }
    }

结果输出:

Index: 2, Type: Class2
Index: 3, Type: Class3

因此,您可以添加任何新类。