Kontext: .NET 3.5, VS2008. Ich bin mir nicht sicher über den Titel dieser Frage, so fühlen sich frei, über den Titel zu kommentieren, auch :-)
Hier ist das Szenario: Ich habe mehrere Klassen, sagen wir Foo und Bar, alle von ihnen implementieren die folgende Schnittstelle:
public interface IStartable
{
void Start();
void Stop();
}
Und nun möchte ich eine Containerklasse haben, die in ihrem Konstruktor ein IEnumerable<IStartable> als Argument bekommt. Diese Klasse wiederum soll auch die Schnittstelle IStartable implementieren:
public class StartableGroup : IStartable // this is the container class
{
private readonly IEnumerable<IStartable> startables;
public StartableGroup(IEnumerable<IStartable> startables)
{
this.startables = startables;
}
public void Start()
{
foreach (var startable in startables)
{
startable.Start();
}
}
public void Stop()
{
foreach (var startable in startables)
{
startable.Stop();
}
}
}
Meine Frage ist also: Wie kann ich es tun, ohne den Code manuell zu schreiben und ohne Codegenerierung? Mit anderen Worten, ich hätte gerne so etwas wie das Folgende.
var arr = new IStartable[] { new Foo(), new Bar("wow") };
var mygroup = GroupGenerator<IStartable>.Create(arr);
mygroup.Start(); // --> calls Foo's Start and Bar's Start
Sachzwänge:
- Keine Codegenerierung (d. h. kein echter Textcode zur Kompilierzeit)
- Die Schnittstelle hat nur ungültige Methoden, mit oder ohne Argumente
Motivation:
- Ich habe eine ziemlich große Anwendung mit einer Vielzahl von Plugins mit verschiedenen Schnittstellen. Das manuelle Schreiben einer "Gruppencontainer"-Klasse für jede Schnittstelle "überlastet" das Projekt mit Klassen
- Manuelles Schreiben des Codes ist fehleranfällig
- Jede Ergänzung oder Signaturaktualisierung der IStartable-Schnittstelle führt zu (manuellen) Änderungen in der Klasse "Gruppencontainer".
- Lernen
Ich verstehe, dass ich hier Reflexion verwenden muss, aber ich würde lieber ein robustes Framework verwenden (wie Castle's DynamicProxy o RunSharp ), um die Verkabelung für mich zu erledigen.
Haben Sie eine Idee?