2015-12-24 2 views
0

Я использую отражение для копирования данных между объектами, которые реализуют один и тот же интерфейс, все работает нормально, но перед развертыванием в производство я хотел спросить: есть ли какие-то причины, почему я должен избегать этого?Есть ли недостатки в использовании отражения для копирования объектов?

Моя предыдущая реализация с жестко закодированными свойствами не смогла обнаружить дополнения к интерфейсу и не позволила мне или моей команде ошибочно скопировать свойство на другой тип того же типа.

Кроме того, я кэширую по статическому словарю свойства по типу, имеет ли это какое-либо преимущество или я просто удваиваю словарь CLR?

ответ

0

Существуют две основные проблемы, связанные с использованием Reflection способом, описанным:

  1. Это обычно будет медленнее, чем непосредственно создаваемом коде, а иногда сильно медленнее.

  2. Он предполагает, что вся информация, подлежащая копированию, будет доступна одинаково.

Хотя иногда это может быть возможно использовать Reflection для создания прокси-объекты для классов функциональность которых отображались бы хорошо к интерфейсу, но который не может быть изменен на самом деле осуществить это, я хотел бы предложить, что если вы контролируете классы и интерфейсы, вы должны включить в интерфейсы все функции, необходимые для копирования объектов, чтобы избежать необходимости использовать Reflection, даже если новые функции добавлены (например, определить методы для создания новых объектов с данными, скопированными из старых), включая данные, которые вызывающий может не знать о).

+0

Какая часть меньше? Тот, где я получаю свойства интерфейса (он выполняется один раз) или тот, где я делаю setvalue (getvalue())? Я думаю, что я напишу некоторые тесты ... –

+0

Можно использовать Reflection для создания разумно эффективного кода. Это будет не так быстро, как прямая отправка, но может работать прилично. Большая проблема, которую я должен описать более подробно, - вторая. Бывают случаи, когда необходимо, чтобы контракт на интерфейс указывал: «Любая законная реализация этого интерфейса должна иметь статический метод, называемый X с сигнатурой Y», а для вспомогательного метода такого интерфейса использовать Reflection для вызова такого метода. Существование таких методов обычно было бы «детальностью реализации», а не частью контракта на интерфейс ... – supercat

+0

... но иногда полезно иметь общий метод, который принимает тип «T», ограниченный, например, 'IConstructableFrom ' поэтому код с 'String' может преобразовать его в' T' из него. В общем, однако, интерфейсные контракты должны избегать указания того, как должны работать вещи с Reflection. Это нехорошо семантически, даже если производительность будет приемлемой. – supercat

0

Другой альтернативой вашей предыдущей реализации является использование таких инструментов, как AutoMapper, поэтому вам не нужно писать код сопоставления самостоятельно.

+0

делает 'AutoMapper' также использовать' Reflecton' за сценой? –

+0

Потребовалось что-то вроде 10 строк, чтобы написать мои собственные, которые я могу легко контролировать, и я знаю, как это работает, и мне не нужно беспокоиться, как я могу распространять ... Итак ... Нет, не похоже на приятное идея мне ... –

+0

@ kienct89 это –

Смежные вопросы