Зачем нам вообще нужно отражение? - PullRequest
0 голосов
/ 08 мая 2018

Я изучал Reflection, я получил некоторые из них, но я не понимаю всего, что связано с этой концепцией. Зачем нам нужно отражение? Что нам не удалось достичь, что нам нужно Отражение?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Отражение - это настолько глубокая часть .NET Framework, что вы часто не знаете, что делаете (см., Например, Атрибуты и LINQ). И когда вы знаете, что делаете это, даже если это кажется неправильным, это может быть единственным способом достижения конкретной цели.

Помимо двух широких областей, которые здесь упоминал Эрик, есть еще несколько. Их гораздо больше, это просто те, которые сразу приходят на ум.

Сериализация (и аналогичная)

Независимо от того, используете ли вы XML или JSON или сами катаетесь, сериализацию объектов намного проще, если вам не нужно писать конкретный код для каждого класса, чтобы включить сериализацию. Отражение позволяет вам перечислить свойства в вашем объекте, которые были помечены (или не помечены) для разделения, и записать их в вывод.

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

Доступ к скрытым данным

Да, я знаю, это хитроумно. И да, Эрик, вероятно, собирается ударить меня за это, но ...

Там много кода - я смотрю на вас, ASP.NET - который скрывает интересные и полезные вещи за private или protected. Иногда единственный способ получить их - это использовать отражение. Иногда это не единственный способ, но это может быть более простой способ.

Атрибуты

Каждый раз, когда вы маркируете Attribute на один из ваших классов, методов и т. Д., Вы неявно предоставляете данные, к которым будет получен доступ посредством отражения. Хотите использовать эти атрибуты самостоятельно? Отражение - единственный способ, которым вы можете получить их.

LINQ и другие выражения

Это действительно важные вещи в наши дни. Если вы когда-либо использовали LINQ to SQL, Entity Frameworks и т. Д., То вы каким-то образом использовали Expression. Вы пишете простой маленький POCO для представления строки в таблице базы данных, а все остальное обрабатывается с помощью отражения. Когда вы пишете выражение предиката, система использует модель отражения для построения структур, которые затем обрабатываются (посещаются) для построения оператора SQL.

Выражения не только для LINQ, вы сами делаете действительно интересные вещи, когда знаете, что делаете. У меня есть код для генерации парсеров строк для импорта CSV, которые чертовски быстро работают при компиляции в Func<string, TRecord>. Сейчас я обычно использую маппер, который написал кто-то другой, но в то время мне нужно было еще на несколько% сократить общее время импорта для файла с записями по 20 КБ, которые периодически загружались на веб-сайт.

P / Invoke Marshalling

Это большое событие за кулисами, а иногда и на переднем плане. Когда вы хотите вызвать функцию API Windows или использовать собственную DLL, P / Invoke дает вам способы достичь этого без необходимости возиться с созданием буферов памяти в обоих направлениях. Методы сортировки используют рефлексию, чтобы выполнять перевод определенных вещей - строк и т. Д., Являющихся очевидным примером, - так что вам не нужно пачкать руки. Все основано на Type объекте, который является основой отражения.


Факт, без размышлений .NET Framework не был бы тем, чем он является. Нет Attribute с, нет Expression с, вероятно, намного меньше взаимодействия между языками. Нет автоматической сортировки. Нет LINQ ... по крайней мере, так, как мы часто используем его сейчас.

0 голосов
/ 08 мая 2018

Существует много-много сценариев, которые позволяет рефлексия, но я группирую их в основном в два сегмента.

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

Рассмотрим, например, самый основной вопрос о сборке: какие типы в ней? Сборки самоописывают , а отражение - это механизм, с помощью которого это описание отображается в другом коде.

Предположим, например, что вы хотели написать программу, которая брала сборку и выполняла графическое отображение связей между различными классами в этой сборке, чтобы помочь вам понять этот код. Есть такие инструменты. Они в Visual Studio. Кто-то написал эти инструменты. Они не появились по волшебству. Reflection - это механизм, встроенный в среду .NET, который позволяет вам, мне или кому-либо еще писать инструменты, понимающие код.

  • Отражение позволяет нам перевести привязки времени компиляции во время выполнения.

Предположим, у вас есть статический метод Foo.Bar(). Когда вы помещаете в свою программу вызов Foo.Bar(), вы со 100% уверенностью знаете, что метод, который, по вашему мнению, будет вызываться, действительно будет вызван. Мы называем статические методы «статическими», потому что привязка имени Bar к вызываемому коду может быть понята статически - то есть без запуска программы.

Теперь рассмотрим виртуальный метод Blah() в базовом классе. Когда вы вызываете whatever.Blah(), вы не знаете точно, какой Blah() будет вызываться во время компиляции, но вы знаете, что некоторый метод Blah() без аргументов будет вызываться для some * Тип 1034 *, который является типом времени выполнения whatever, и этот тип равен или получен из типа, который объявляет Blah(). (На самом деле вы знаете больше: вы знаете, что он равен или получен из типа времени компиляции whatever.) Виртуальное связывание является формой динамического связывания, но оно не является полностью динамическим. Пользователь не может решить, что этот вызов должен относиться к другому методу в иерархии другого типа.

Отражение позволяет нам совершать вызовы, которые связаны полностью во время выполнения, на основе полностью по выбору пользователя, если мы захотим. Мы платим штраф за производительность и теряем безопасность типов во время компиляции, но мы получаем гибкость, чтобы во время выполнения 100% решить, какой код мы называем. Есть сценарии, где это разумный компромисс.

...