Tôi hiện đang gặp sự cố trong C# mà tôi cho rằng có thể được giải quyết bằng các loại hiện có. Tuy nhiên, tôi không thực sự biết nếu họ có thể được tạo ra trong C#, hoặc mô phỏng (sử dụng một số cấu trúc khác).Các loại tồn tại trong C#?
Về cơ bản tôi muốn có một số mã như thế này:
public interface MyInterface<T>
{
T GetSomething();
void DoSomething(T something);
}
public class MyIntClass : MyInterface<int>
{
int GetSomething()
{
return 42;
}
void DoSomething(int something)
{
Console.Write(something);
}
}
public class MyStringClass : MyInterface<string>
{
string GetSomething()
{
return "Something";
}
void DoSomething(string something)
{
SomeStaticClass.DoSomethingWithString(something);
}
}
Tiếp theo, tôi muốn để có thể lặp thông qua một danh sách các đối tượng mà thực hiện giao diện này, nhưng mà không quan tâm những gì tham số kiểu nó có. Một cái gì đó như thế này:
public static void DoALotOfThingsTwice(){
var listOfThings = new List<MyInterface<T>>(){
new MyIntClass(),
new MyStringClass();
};
foreach (MyInterface<T> thingDoer in listOfThings){
T something = thingDoer.GetSomething();
thingDoer.DoSomething(something);
thingDoer.DoSomething(something);
}
}
này không biên dịch vì T
sử dụng bởi MyIntClass
và được sử dụng bởi MyStringClass
là khác nhau.
Tôi đã suy nghĩ rằng một cái gì đó như thế này có thể làm các trick, nhưng tôi không biết nếu có một cách hợp lệ để làm như vậy trong C#:
public static void DoALotOfThingsTwice(){
var listOfThings = new List<∃T.MyInterface<T>>(){
new MyIntClass(),
new MyStringClass();
};
foreach (∃T.MyInterface<T> thingDoer in listOfThings){
T something = thingDoer.GetSomething();
thingDoer.DoSomething(something);
thingDoer.DoSomething(something);
}
}
Như kiểu là bất biến, không, đó là không thể. – Servy
Bạn có thể bọc hoạt động trong một 'Hành động' và sau đó lưu trữ các hoạt động đó trong một danh sách. Bạn có thể tạo những hành động đó một cách tổng quát. – Lee