我有一个抽象类:
abstract class AbstractDataExport { public string name; public abstract bool ExportData(); }
我有一些派生自AbstractDataExport的类:
class XmlExport : AbstractDataExport { new public string name = "XmlExporter"; public override bool ExportData() { ... } } class CsvExport : AbstractDataExport { new public string name = "CsvExporter"; public override bool ExportData() { ... } }
有可能做这样的事情吗?(伪代码:)
foreach (Implementation imp in Reflection.GetInheritedClasses(AbstractDataExport) { AbstractDataExport derivedClass = Implementation.CallConstructor(); Console.WriteLine(derivedClass.name) }
输出像
CsvExporter XmlExporter
?
这背后的想法是只创建一个从AbstractDataExport派生的新类,这样我就可以自动迭代所有实现,并将名称添加到Dropdown- List中。我只想编写派生类,而不更改项目中的其他任何内容,重新编译,宾果游戏!
如果您有其他解决方案:请告诉em。
谢谢
这是一个普遍的问题,尤其是在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