рис. 23.1.
.Иерархия.типов.отражения
Приведенная далее программа демонстрирует, как нужно запрашивать члены
типа и выводить информацию о них. Этот код обрабатывает все открытые типы всех
сборок, загруженных в вызывающий домен приложений. Для каждого типа вызы-
вается свойство
DeclaredMembers
, которое возвращает коллекцию объектов типа,
производного от
MemberInfo
; каждый объект описывает один член из определенных
в типе. Далее для каждого члена выводятся его описание (поле, конструктор, метод,
свойство и т. п.) и строковое значение (полученное вызовом
ToString
).
using System;
using System.Reflection;
public static class Program {
public static void Main() {
// Перебор всех сборок, загруженных в домене
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly a in assemblies) {
655
Нахождение.членов.типа.путем.отражения
Show(0, "Assembly: {0}", a);
// Поиск типов в сборке
foreach (Type t in a.ExportedTypes) {
Show(1, "Type: {0}", t);
// Получение информации о членах типа
foreach (MemberInfo mi in t.GetTypeInfo().DeclaredMembers) {
String typeName = String.Empty;
if (mi is Type) typeName = "(Nested) Type";
if (mi is FieldInfo) typeName = "FieldInfo";
if (mi is MethodInfo) typeName = "MethodInfo";
if (mi is ConstructorInfo) typeName = "ConstructoInfo";
if (mi is PropertyInfo) typeName = "PropertyInfo";
if (mi is EventInfo) typeName = "EventInfo";
Show(2, "{0}: {1}", typeName, mi);
}
} }
}
private static void Show(Int32 indent, String format, params Object[] args) {
Console.WriteLine(new String(' ', 3 * indent) + format, args);
}
}
После компиляции и запуска приложения мы получаем массу информации.
Вот ее часть:
Assembly: mscorlib, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
Type: System.Object
MethodInfo: System.String ToString()
MethodInfo: Boolean Equals(System.Object)
MethodInfo: Boolean Equals(System.Object, System.Object)
MethodInfo: Boolean ReferenceEquals(System.Object, System.Object)
MethodInfo: Int32 GetHashCode()
MethodInfo: System.Type GetType()
MethodInfo: Void Finalize()
MethodInfo: System.Object MemberwiseClone()
MethodInfo: Void FieldSetter(System.String, System.String, System.Object)
MethodInfo: Void FieldGetter(System.String, System.String,
System.Object ByRef)
MethodInfo: System.Reflection.FieldInfo GetFieldInfo(System.String,
System.String)
ConstructoInfo: Void .ctor()
Type: System.Collections.Generic.IComparer`1[T]
MethodInfo: Int32 Compare(T, T)
Type: System.Collections.IEnumerator
MethodInfo: Boolean MoveNext()
MethodInfo: System.Object get_Current()
MethodInfo: Void Reset()
PropertyInfo: System.Object Current
Type: System.IDisposable
продолжение
656
Do'stlaringiz bilan baham: |