这是一个普遍的问题,尤其是在GUI应用程序中,令我惊讶的是,没有BCL类可以直接使用。这是我的方法。
public static class ReflectiveEnumerator{ static ReflectiveEnumerator() { } 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)); } objects.Sort(); return objects; }}一些注意事项:
- 不必担心此操作的“成本”-您只需要(希望)执行一次,即使这样它也不会像您想的那样慢。
- 您需要使用,
Assembly.GetAssembly(typeof(T))
因为您的基类可能在不同的程序集中。 - 您需要使用条件
type.IsClass
,!type.IsAbstract
因为如果您尝试实例化接口或抽象类,它将引发异常。 - 我喜欢强制枚举类实现,
IComparable
以便可以对它们进行排序。 - 您的子类必须具有相同的构造函数签名,否则它将引发异常。这通常对我来说不是问题。


![获取抽象类的所有继承的类[重复] 获取抽象类的所有继承的类[重复]](http://www.mshxw.com/aiimages/31/576299.png)
