컨텍스트 : .NET 3.5, VS2008. 이 질문의 제목에 대해 잘 모르겠습니다. 제목에 대해서도 자유롭게 의견을 말하자면 :-)C#에서 주어진 인터페이스를 구현하는 일반 컨테이너 클래스를 작성하려면 어떻게해야합니까?
여기 시나리오가 있습니다 : 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();
}
}
}
그래서 내 질문은 : 나는 코드 생성하지 않고 코드를 작성 수동으로하지 않고 그것을 할 수 있는가? 즉, 나는 다음과 같이 somethig하고 싶습니다.
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
제약 :
- 없음 코드 생성 (즉, 컴파일시에 실제 텍스트 코드 없음)
- 인터페이스만을 무효 방법, 또는 인수없이 있다
동기 부여 :
- 저는 다양한 인터페이스의 많은 플러그인과 함께 꽤 큰 응용 프로그램을 가지고 있습니다. 각 인터페이스에 대한 "그룹 컨테이너"클래스를 수동으로 작성하면 클래스로 프로젝트가 "오버로드"됩니다.
- 코드를 수동으로 작성하면 오류가 발생합니다.
- IStartable 인터페이스에 대한 추가 또는 서명 업데이트로 인해 " 그룹 컨테이너 "클래스
- 내가 여기 반사를 사용할 필요는 이해하지만 오히려 나를 위해 배선을 할 (성의 DynamicProxy 또는 RunSharp 같은) 강력한 프레임 워크를 사용하는 것
학습.
의견이 있으십니까?
StartableGroup 클래스를 갖고 싶지 않으십니까? 그게 뭐가 잘못 됐어? – Noldorin
나는 물을 수 있는가? 왜? 이것이 해결해야 할 문제는 무엇입니까? (이것은 대답에 영향을 줄 수 있습니다 ...). –
@ Noldorin, @Marc Gravell, 동기 부여가 원래 질문에 추가되었습니다. –