Резюме для программиста
Я смотрю код разных библиотек, и там если надо хранить некое универсальное значение (скажем, для контейнера в котором может храниться почти любой тип), то многие используют object. Например
public void SetFilterValue(object value)
{
if (
(FilterPropertyType == typeof(DateTimeOffset)
||
FilterPropertyType == typeof(DateTimeOffset?)) && value != null && value is DateTime?)
}
И это ещё "скромно". Такое есть в исходниках многих либ, в том числе "солидных", в которые коммитят или за которыми следят разные "гуру" и "евангелисты", главные по разработке какого-нибудь широко используемого фреймворка (вот как этот). Часто втречаются деревья на десятки if и прочих ветвлений, т.к. основной контейнер для хранения чего-то сделан универсальным (типа object или string), и потом его значение долго парсят по типам или из строки.
Похоже, что это норма и всякие "семизнаки и гуры" этим не брезгуют. ))
Я всегда считал, что есть, наверное, какой-то более надёжный с точки зрения ООП способ. Например, как-то продумать систему классов, чтобы для каждого типа был свой строготипизированный контейнер. А тут гуры лепят не оглядываясь портянки и в динамике проверяют типы, как какие-нибудь джаваскриптизёры. Что интересно, что в их статейках "как надо программировать" таких портянок обычно не встретишь - там как раз рассусоливания о гениальных структурах кода и проектировании систем классов на примерах разных животных или автомобилей - всё аккуратненько, коротенько и цивильно. Вот есть кошечки и собачки, а вместе они животные и живут в маленьком уютном домике - вот вам родитель, вот потомок,
вот контейнер. Видите, как хорошо, тепло и чистенько. Никаких портянок, никаких выведений типов из object или строк.