Выравнивание для отражения в C#

10
задан ljs 6 September 2008 в 21:10
поделиться

5 ответов

Иногда использование отражения может быть определенным взломом, но много времени это - просто самый фантастический инструмент кода.

Посмотрите на сетку свойства .NET - любой, кто использовал Visual Studio, будет знакомо с ним. Можно указать на него на любой объект, и это это произведет простой редактор свойств. Это использует отражение, на самом деле большая часть панели инструментов VS делает.

Взгляд на модульные тесты - они загружаются отражением (по крайней мере, в NUnit и MSTest).

Отражение позволяет поведение динамического стиля со статических языков.

Одной вещью, в которой действительно требуется, является утиный ввод - компилятор C# уже поддерживает это: Вы можете foreach что-либо, что похоже IEnumerable, реализует ли это интерфейс или нет. Можно использовать синтаксис набора C#3 на любом классе, которому назвали метод Add.

Используйте отражение везде, где Вам нужно поведение динамического стиля - например, у Вас есть набор объектов, и Вы хотите проверить то же свойство на каждом.

Риски подобны для динамических типов - исключения времени компиляции становятся времени выполнения. Вы кодируете, не так 'безопасно', и необходимо реагировать соответственно.

Код отражения .NET очень быстр, но не с такой скоростью, как явный вызов был бы.

8
ответ дан 3 December 2019 в 23:15
поделиться

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

Пример 1: Отражение в ИЛИ картопостроитель, Вы меняете имя или тип свойства в Вашей объектной модели: время выполнения Аварийных завершений.

Пример 2: Вы находитесь в магазине SOA. Веб-сервисы завершены отделенный (или таким образом, Вы думаете). У них есть свой собственный набор сгенерированных прокси-классов, но в отображении Вас решают сэкономить некоторое время, и Вы делаете это:

ExternalColor c = (ExternalColor)Enum.Parse(typeof(ExternalColor), 
                                            internalColor.ToString());

Под покрытиями это - также отражение, но сделанный самой платформой .NET. Теперь, что происходит, если Вы решаете переименовать InternalColor. Серый к InternalColor. Gray? Все смотрит хорошо, это создает прекрасный, и даже хорошо работает.. до дня некоторый глупый пользователь решает использовать цвет Gray..., в которой точке аварийно завершится картопостроитель.

2
ответ дан 3 December 2019 в 23:15
поделиться

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

Например, я использую отражение в своем уровне ORM, чтобы смочь присвоить свойства со значениями столбцов от таблиц. Если это не было для отражения, я должен был создать класс копии для каждого отображения таблицы/класса.

Что касается внешнего цветного исключения выше. Проблемой не является Перечисление. Синтаксический анализ, но что кодер не не поймал надлежащее исключение. Так как строка анализируется, кодер должен всегда предполагать, что строка может содержать неправильное значение.

Та же проблема относится ко всему усовершенствованному программированию в .NET. "С великой державой, прибывает большая ответственность". Используя отражение дает Вам много питания. Но удостоверьтесь, что Вы знаете, как использовать его правильно. В сети существуют десятки примеров.

2
ответ дан 3 December 2019 в 23:15
поделиться

Это могу быть просто я, но способ, которым я вошел бы в это, путем создания генератора кода - использование отражения во времени выполнения является немного дорогостоящим и не вводится. Создание классов, которые сгенерировать согласно Вашему последнему коду и скопировать все способом со строгим контролем типов, будет означать фиксацию этих ошибок во время изготовления.

Например, сгенерированный класс может быть похожим на это:

static class AtoBCopier
{
    public static B Copy(A item)
    {
        return new B() { Prop1 = item.Prop1, Prop2 = item.Prop2 };
    }
}

Если или класс не имеет свойств или их изменения типов, код не компилирует. Плюс, во времена существует огромное улучшение.

1
ответ дан 3 December 2019 в 23:15
поделиться

Я недавно использовал отражение в C# для нахождения реализаций определенного интерфейса. Я записал простой интерпретатор пакетного стиля, который искал "действия" для каждого шага вычисления на основе имени класса. Отражение текущего пространства имен затем открывается правильная реализация моего интерфейса IStep, который может быть, Выполняют () редактора этот путь, добавление, что новые "действия" так же легки как создание нового производного класса - никакая потребность добавить его к реестру, или еще хуже: упущение добавить его к реестру...

1
ответ дан 3 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: