0

我正在使用反射枚举器类从一个基类类型中获取所有派生类。

    public static Type[] GetArrayOfType<T>() where T : class
    {
        List<Type> objects = new List<Type>();

        foreach (Type type in Assembly.GetAssembly(typeof(T)).GetTypes()
            .Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(T))))
        {
            objects.Add(type);
        }

        // AlphaNumeric Sorting
        objects.Sort(AlphaNumericSort.Comparer);        // Name property is as wanted

        return objects.ToArray();
    }

我想在同一类中对列表进行排序,因为它是静态的,并且在调用依赖它的所有后续 GUI 代码之前调用。

public class AlphaNumericSort : IComparer<object>
{
    static IComparer<object> comparer = new AlphaNumericSort();

    public int Compare(object x, object y)
    {
        string s1 = x.ToString();       // Gives me the FullName
        string s1a = x.GetType().Name;  // Gives me "RuntimeType"

    ...snip

如何在比较器中获得正确的短名称或类的名称?我可以获取 RuntimeType 的 FullName 或对象名称。

编辑:

如果我尝试从 Type

public class AlphaNumericSort : IComparer<Type>
{
    static IComparer<Type> comparer = new AlphaNumericSort();

    public int Compare(Type x, Type y)
    {
        string s1 = x.Name;
        string s2 = y.Name;

然后下面一行

objects.Sort(AlphaNumericSort.Comparer);

给我

参数 1:无法从 'System.Collections.Generic.IComparer' 转换为 'System.Comparison'

'System.Collections.Generic.List.Sort(System.Comparison)' 的最佳重载方法匹配有一些无效参数

编辑2:

    public static IEnumerable<T> GetEnumerableOfType<T>(params object[] constructorArgs) where T : class, IComparable<T>
    {
        List<T> objects = new List<T>();

        foreach (Type type in Assembly.GetAssembly(typeof(T)).GetTypes()
            .Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(T))))
        {
            objects.Add((T)Activator.CreateInstance(type, constructorArgs));
        }

        // AlphaNumeric Sorting
        objects.Sort(AlphaNumericSort.Comparer);   // ERROR!!!

        return objects;
    }
4

2 回答 2

2

除非你不能使用 LINQOrderBy应该需要更少的代码。

 return objects.OrderBy(x => x.FullName).ToArray();

您还可以从中派生比较器IComparer<Type>而不是IComparer<object>(因为您的列表实际上是Type对象列表)并在那里使用Name属性而不进行强制转换。

于 2013-03-17T20:32:46.720 回答
1

您可以在比较器中将对象转换为类型,并使用您想要的任何类型字段。

 public int Compare(object x, object y)
 {
    Type t1 = (Type)x;
于 2013-03-17T20:31:31.790 回答