0

リフレクティブ列挙子クラスを使用して、1 つの基本クラス型からすべての派生クラスを取得しています。

    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

コンパレーターで正しい短縮名またはクラスの名前を取得するにはどうすればよいですか? FullName または RuntimeType のオブジェクト名を取得できます。

編集:

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

LINQ を使用できない場合を除きOrderBy、必要なコードは少なくて済みます。

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

IComparer<Type>代わりにIComparer<object>(リストは実際にはTypeオブジェクトのリストであるため)比較子を派生させ、Nameキャストせずにそこでプロパティを使用することもできます。

于 2013-03-17T20:32:46.720 に答える
1

比較子でオブジェクトを Type にキャストし、必要な Type の任意のフィールドを使用できます。

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