Моя проблема может быть упрощена для списка <> с координатами X и Y, которые я хотел бы сгруппировать в интерфейс или абстрактный класс. Затем у меня есть множество других функций, которые берут этот абстрактный класс в качестве аргумента. Остановимся на том, что элемент X является либо численным, либо является DateTime. Вот некоторые примеры кода, чтобы проиллюстрировать то, что я пытаюсь сделать:C#: интерфейс с любым номером или DateTime
//C# 4.0
abstract class Element : Group<DateTime, double>
{
public DateTime X {get; set;}
public double Y {get; set;}
}
public interface Group<T, U>
{
public T X {get; set;}
public U Y {get; set;}
}
void OtherObject.Do(List<Group<DateTime, double>> elm)
{
double[] X = 0;
for (int i = 0; i < elm.Count; i++)
{
if (elm[i].GetType() == typeof(DateTime))
{
X[i] = ((DateTime)elm[i].X).TOADate();
{
else
{
X[i] = elm.X;
}
}
//Other stuff
}
static Main()
{
List<Element> list = FactoryCreate();
OtherObject obj = new OtherObject();
obj.Do(list);
}
Я хотел бы иметь возможность указать List<Group<DateTime, double>>
аргумент Do()
без указания, что общих типов. Я просто хотел бы сделать Do(List<Group> lst)
.
I может просто исключить параметры типового типа и использовать динамический тип данных в группе, но я не думаю, что это лучший способ.
Есть ли установленный шаблон для решения этой проблемы? Я на 100% открыт для предложений относительно правильного способа моделирования этой структуры данных/класса.
Вы должны указать типы в Do(), потому что вы вызываете X.TOADate(). Компилятор должен знать, где найти метод TOADate(), поэтому он должен знать, какой тип X. –
Добавлен литой (15 символов) – David
Я не понимаю ваших требований. Почему именно вы хотите избавиться от явных аргументов типа в 'D()', если этот метод активно использует знания о них в любом случае? –