Контекст:.NET 3.5, VS2008. Я не уверен в названии этого вопроса, поэтому не стесняйтесь прокомментировать название:-)
Здесь сценарий: у меня есть несколько классов, например Foo и Bar, все они реализуют следующий интерфейс:
public interface IStartable
{
void Start();
void Stop();
}
И теперь я хотел бы иметь контейнерный класс, который получает IEnumerable <IStartable> как аргумент в его конструкторе. Этот класс, в свою очередь, должен также реализовать интерфейс IStartable:
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();
}
}
}
Итак, мой вопрос: как я могу это сделать без ручной записи кода и без генерации кода? Другими словами, я хотел бы иметь что-то вроде следующего.
var arr = new IStartable[] { new Foo(), new Bar("wow") };
var mygroup = GroupGenerator<IStartable>.Create(arr);
mygroup.Start(); // --> calls Foo Start and Bar Start
Ограничения:
- Нет генерации кода (то есть реального текстового кода во время компиляции)
- Интерфейс имеет только void методы, с аргументами или без них
Мотивация:
- У меня есть довольно большое приложение, с большим количеством плагинов различных интерфейсов. Вручную писать класс "group container" для каждого интерфейса "перегружает" проект классами
- Вручную писать код подвержен ошибкам
- Любые дополнения или обновления сигнатур для интерфейса IStartable приведут к (ручным) изменениям в классе "group container"
- Обучение
Я понимаю, что здесь я должен использовать отражение, но я бы предпочел использовать надежную структуру (например, Castle DynamicProxy или RunSharp), чтобы сделать проводку для меня.
Любые мысли?