我正在使用反射枚举器类从一个基类类型中获取所有派生类。
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;
}