Obecnie mam do czynienia z problemem w języku C#, który moim zdaniem mógłby zostać rozwiązany przy użyciu typów egzystencjalnych. Jednak tak naprawdę nie wiem, czy można je utworzyć w języku C#, czy symulować (używając innego konstruktu).Egzystencjalne typy w C#?
Zasadniczo chcę mieć pewne kodu:
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);
}
}
Dalej chcę być w stanie wykonać iterację listy obiektów, które implementują ten interfejs, ale nie dbając jaki typ parametr ma. Coś takiego:
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);
}
}
nie skompilować, ponieważ T
wykorzystywane przez MyIntClass
i jeden używany przez MyStringClass
są różne.
Myślałam, że coś takiego może załatwić sprawę, ale nie wiem, czy jest poprawny sposób to zrobić w 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);
}
}
jako typ jest niezmienna, nie, to nie jest możliwe. – Servy
Można zawinąć operację w "Akcji", a następnie zapisać je na liście. Możesz tworzyć te akcje w sposób ogólny. – Lee