Что такое отражение? - PullRequest
6 голосов
/ 05 октября 2008

Я ОЧЕНЬ новичок в ASP.NET. Я пришел из VB6 / ASP (классический) / SQL Server 2000 фона. Я много читаю о Visual Studio 2008 (установил его и ковыряюсь). Я читал об «рефлексии» и хотел бы, чтобы кто-то как можно лучше объяснил старшему разработчику технологий, которые я написал выше, что такое Reflection и почему я бы использовал его ... У меня проблемы с получением моя голова вокруг этого. Спасибо!

Ответы [ 6 ]

8 голосов
/ 05 октября 2008

Отражение - это то, как вы можете исследовать внутренности различных типов, обычно не имея доступа (например, частные, защищенные и т. Д. Члены).

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

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

Что касается того, почему вы используете его, он обычно используется только в сложных ситуациях или при анализе кода. Другое распространенное использование - загрузка предварительно скомпилированных плагинов в ваш проект.

3 голосов
/ 05 октября 2008

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

Как пример:

myobject.GetType().GetProperty("MyProperty").SetValue(myobject, "wicked!", null)
2 голосов
/ 05 октября 2008

Позволяет внутренним объектам отражаться во внешнем мире (код, который использует указанные объекты).

Практическое использование в статически типизированных языках, таких как C # (и Java), состоит в том, чтобы разрешить вызов методов / членов во время выполнения через строку (например, имя метода - возможно, вы не знаете название метода, который будете использовать использовать во время компиляции).

В контексте динамических языков я не слишком часто слышал этот термин (как правило, вы не беспокоитесь о вышеизложенном), за исключением, возможно, итерации по списку методов / членов и т. Д. *

1 голос
/ 05 октября 2008

Отражение - это средство .Net для манипулирования или извлечения информации о сборке, классе или методе в время выполнения . Например, вы можете создать класс во время выполнения, включая его методы. Как утверждает monoxide, отражение используется для динамической загрузки сборки в виде плагинов, или в предварительных случаях оно используется для создания компилятора .Net, нацеленного на .Net, например IronPython.

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

0 голосов
/ 17 ноября 2018

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

0 голосов
/ 05 октября 2008

При сборке любой сборки в .NET (ASP.NET, Windows Forms, Командная строка, библиотека классов и т. Д.) В хранилище сборок также создается ряд «таблиц определений» метаданных. информация о методах, полях и типах, соответствующих типам, полям и методам, которые вы написали в своем коде.

Классы в пространстве имен System.Reflection в .NET позволяют перечислять и взаимодействовать с этими таблицами, предоставляя «объектную модель» для запроса и доступа к элементам в этих таблицах.

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

Пользовательские атрибуты также идут рука об руку с отражением. Например, инфраструктура модульного тестирования NUnit позволяет указать класс тестирования и методы тестирования, добавив атрибуты [Test] {TestFixture] в свой собственный код.

Однако тогда исполнитель тестов NUnit должен использовать Reflection для загрузки вашей сборки, искать все вхождения методов, которые имеют атрибут test, а затем фактически вызывать ваш тест.

Это сильно упрощает, но дает хороший практический пример того, где Отражение необходимо.

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

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

...