Отражение позволяет получить информацию о типах в своей программе, а также в других сборках, а также читать метаданные из манифеста. Большинство классов находится в 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));