Bối cảnh: .NET 3.5, VS2008. Tôi không chắc chắn về tiêu đề của câu hỏi này, vì vậy bạn cũng có thể tự do nhận xét về tiêu đề này :-)Làm thế nào tôi có thể viết một lớp container chung mà thực hiện một giao diện nhất định trong C#?
Đây là kịch bản: Tôi có một số lớp, nói Foo và Bar, tất cả đều thực hiện giao diện sau :
public interface IStartable
{
void Start();
void Stop();
}
Và bây giờ tôi muốn có một lớp container, mà được một IEnumerable <IStartable> như một tham số trong constructor của nó. Lớp này, đến lượt mình, cũng nên triển khai giao diện 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();
}
}
}
Vì vậy, câu hỏi của tôi là: làm thế nào tôi có thể làm điều đó mà không cần viết mã theo cách thủ công và không cần tạo mã? Nói cách khác, tôi muốn có một vài thứ như sau.
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
ràng buộc:
- Không sinh mã (có nghĩa là, không có mã văn bản thực tại thời gian biên dịch)
- Giao diện chỉ có khoảng trống phương pháp, có hoặc không có đối số
Động lực:
- Tôi có một ứng dụng khá lớn, với rất nhiều plugin của các giao diện khác nhau. Viết thủ công lớp "nhóm chứa" cho từng giao diện "quá tải" của dự án với các lớp
- Viết mã theo cách thủ công là dễ bị lỗi
- Mọi bổ sung hoặc cập nhật chữ ký cho giao diện IStartable sẽ dẫn đến thay đổi (thủ công) trong " chứa nhóm" class
- Học
tôi hiểu rằng tôi phải sử dụng phản ánh ở đây, nhưng tôi muốn sử dụng một khuôn khổ mạnh mẽ (như Lâu đài của DynamicProxy hoặc RunSharp) để thực hiện hệ thống dây điện cho tôi.
Mọi suy nghĩ?
Vì vậy, bạn * không * muốn có một lớp StartableGroup? Có gì sai với nó? – Noldorin
Tôi có thể hỏi: tại sao? Vấn đề mà điều này cần phải giải quyết là gì? (điều này có thể ảnh hưởng đến câu trả lời ...). –
@Noldorin, @Marc Gravell, động lực được thêm vào câu hỏi ban đầu. –