Допустим, у меня есть объект данных, но этот объект может содержать один из нескольких типов данных.
class Foo
{
int intFoo;
double doubleFoo;
string stringFoo;
}
Теперь я хочу создать аксессор. Какой-то способ получить эти данные. Очевидно, я мог бы создать несколько методов доступа:
public int GetIntFoo();
public double GetDoubleFoo();
public string GetStringFoo();
Или я мог бы создать несколько свойств
public int IntFoo { get; set; }
public double DoubleFoo { get; set; }
public string StringFoo { get; set; }
Не думаю, что это очень хороший дизайн. Это требует, чтобы клиентский код больше заботился о типе, чем это должно быть. Более того, мне действительно нужно только одно значение для этого класса, и вышеизложенное позволит назначить один из каждого типа одновременно. Не хорошо.
Один из вариантов - использовать Generics.
class Foo<T>
{
public T TheFoo { get; set; }
}
Однако, это не создает Foo, оно создает Foo . У каждого свой тип, поэтому я не могу использовать их как один и тот же тип.
Я мог бы извлечь Foo из FooBase, затем обработать все из них как FooBase, но тогда я снова столкнулся с проблемой доступа к данным.
Другой вариант Generics - использовать что-то вроде этого:
class Foo
{
string stringRepresentationOfFoo;
public T GetFoo<T>() { return /* code to convert string to type */ }
}
Конечно, проблема в том, что можно передать любой тип T, и, честно говоря, он немного занят.
Я мог бы также просто поместить значения и вернуть объект, но тогда нет безопасности типов.
В идеале, я хочу относиться ко всем Foo одинаково, но я хочу безопасность типов, чтобы, если нет StringFoo, я даже не мог скомпилировать ссылку на StringFoo.
Foo foo = new Foo("Foo");
string sFoo = foo.Value; // succeeds.
Foo foo = new Foo(0);
int iFoo = foo.Value; // succeeds
string sFoo = foo.Value; // compile error
Возможно, это даже невозможно ... и мне придется пойти на некоторые компромиссы, но, возможно, я что-то упустил.
Есть идеи?
EDIT:
Хорошо, как указывает Даниэль, проверка времени компиляции типа времени выполнения нецелесообразна.
Какой мой лучший вариант для того, что я хочу сделать здесь? А именно, относиться ко всем Foo одинаково, но все же иметь относительно нормальный механизм доступа?
EDIT2:
Я не хочу преобразовывать значение в разные типы. Я хочу вернуть правильный тип для значения. То есть, если это двойное число, я не хочу возвращать int.