Отражение - это настолько глубокая часть .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 ... по крайней мере, так, как мы часто используем его сейчас.