リフレクティブ列挙子クラスを使用して、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;
}