C# → Отражения

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

System.Type

Type t = typeof(double);

Существует большое количество методов, но все они следуют одному и тому же шаблону.

Пример: GetMethod() возвращает ссылку на объект System.Reflection.MethodInfo (возвращает сведения только для одного метода, с указанным списком параметров), а GetMethods() – возвращает массив таких ссылок (возвращает сведения обо всех методах). Оба метода имеют перегруженный параметр BindingFlags – значение перечисляемого типа, показывающее какие члены должны быть возвращены (открытые члены, члены экземпляра, статические члены).

      Type t = typeof(double);
      MethodInfo[] Methods = t.GetMethods();
      foreach (MethodInfo NextMethod in Methods)
      {   NextMethod.Invoke(); // вызвать метод }

System.Reflection.Assembly

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

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

LoadFrom() – принимает путь к любой из сборок.

Assembly Assembly1 = Assembly.Load("SomeAssembly");
Assembly Assembly2 = Assembly.LoadFrom(@"C:\temp\SomeAssembly");
string Name = Assembly1.FullName;

GetTypes() – позволяет получить сведения обо всех типах, определенных в сборке. Возвращает массив ссылок System.Type.

Type[] Types = Assembly1.GetTypes();
foreach (Type DefinedType in Types)
{  DoSomething(DefinedType); }

Для получения сведений об пользовательских атрибутах: для сборки вообще:

Attribute[] DefinedAttributes = Attribute.GetCustomAttributes(Assembly1);

Для того, чтобы выяснить, присутствует ли в сборке атрибут следует вызвать GetCustomAttributes() и передать ему имя атрибута, если атрибут представлен, мы получим массив, в котором содержатся все его экземпляры. Если в сборке не определено ни одного его экземпляра, будет возвращен null.

Attribute SupportAttribute = Attribute.GetCustomAttributes(Assembly1,typeof(SupportsWhatNewAttribute));