Страницы

Поиск по вопросам

суббота, 13 октября 2018 г.

Как в C# обходились, когда не было Dynamic?

Например, из вне приходит какой-то объект неизвестного типа.
Известно, что объекты могут быть разными(разные поля), но одно поле всегда есть у данного объекта.
Через Dynamic- это тривиальная задача, а как это делалось, когда он не был введен в C#?
UPD
Пример кода работы с Dapper, где руками мапятся колонки
var codes = conn.Query(...sql and params here...) .Select(s=>new Code{Id = s.Id, Type = s.Type, Value = s.code, Description = s.Description});


Ответ

Если говорить в целом, то до появления dynamic работа с логикой объектов неизвестного типа (а знание о том, что у объекта есть определенный атрибут и, тем более, операции с ним - это, хочешь не хочешь, а работа с логикой) в языке программирования со строгой типизацией считалось дурным тоном и bad practice. Некоторые олдфаги, типа меня, считают так до сих пор.
Но если очень надо, то есть два варианта: наследование и Reflection.
Наследование применяется в тех случаях, когда у вас есть контроль над моделью данных - тогда можно сделать либо базовый класс, либо (еще лучше) интерфейс с нужным полем, отнаследоваться, в нужном месте скастовать и далее работать уже как с обычным объектом.
Вариант с reflection применяется, если наследование делать нельзя или не хочется - например, мы используем модель данных из внешней библиотеки. В этом случае, мы просто лезем внутрь объекта и при помощи reflection'а выдираем нужное поле.
Оформить этот процесс в реализацию можно множеством способов. Можно использовать какой-нибудь фреймворк, который обернет несколько команд в одну типа GetPropertyValue. Можно сделать класс с нужными полями и, используя автомаппер (которых есть великое множество), скопировать поля неизвестного объекта в наш объект. Можно все поля неизвестного объекта скинуть в Dictionary и работать уже с ним.

Комментариев нет:

Отправить комментарий