У меня в настоящее время проблема с C#, которая, как я думаю, может быть решена с использованием экзистенциальных типов. Тем не менее, я действительно не знаю, могут ли они быть созданы на C# или смоделированы (с использованием какой-либо другой конструкции).Экзистенциальные типы в C#?
В основном я хочу, чтобы иметь некоторый код, как это:
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);
}
}
Далее я хочу, чтобы иметь возможность перебирать список объектов, которые реализуют этот интерфейс, но, не заботясь о каком типе параметра имеет. Что-то вроде этого:
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);
}
}
Это не компилируется, потому что T
используется MyIntClass
и один используется MyStringClass
разные.
Я думал, что нечто подобное может сделать трюк, но я не знаю, есть ли действительный способ сделать это в 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);
}
}
Как тип инвариантно, нет, это невозможно. – Servy
Вы можете перенести операцию в «Действие», а затем сохранить ее в списке. Вы можете создавать эти действия в общих чертах. – Lee