Résolu! Solution sur le fond.
Bonjour!
J'ai une classe abstraite:
abstract class AbstractDataExport
{
public string name;
public abstract bool ExportData();
}
J'ai des cours qui sont dérivés de 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()
{
...
}
}
Est-il possible de faire quelque chose comme cela? (Pseudo-code:)
foreach (Implementation imp in Reflection.GetInheritedClasses(AbstractDataExport)
{
AbstractDataExport derivedClass = Implementation.CallConstructor();
Console.WriteLine(derivedClass.name)
}
avec une sortie comme
CsvExporter
XmlExporter
?
L'idée derrière cela est de simplement créer une nouvelle classe qui est dérivée à partir de AbstractDataExport donc je peut itérer sur toutes les implémentations automatiquement et ajouter par exemple les noms d'une liste Déroulante Liste. Je veux juste le code de la classe dérivée sans rien changer d'autre dans le projet, recompiler, bingo!
Si vous avez d'autres solutions: tell em.
Merci
Solution:
Type[] types = Assembly.GetExecutingAssembly().GetTypes();
foreach (Type type in types)
{
if (type.IsSubclassOf(typeof(AbstractDataExport)))
{
//Find all Constructors with no arguments (Type.EmptyTypes) and call them - with no arguments (null)
AbstractDataExport abcde = (AbstractDataExport)type.GetConstructor(Type.EmptyTypes).Invoke(null);
abcde.ExportData();
}
}