Страницы

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

вторник, 10 декабря 2019 г.

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

#c_sharp #net


Например, из вне приходит какой-то объект неизвестного типа.

Известно, что объекты могут быть разными(разные поля), но одно поле всегда есть у
данного объекта.

Через 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});

    


Ответы

Ответ 1



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

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

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