Используйте пространство имен: System.Refection.
Роль: вы можете просматривать содержимое скомпилированной библиотеки классов.
Три варианта использования отражения: 1. Просмотр метаданных. 2. Динамически создавать объекты. 3. Метод динамического вызова.
Цель отражения:
(1) Используйте Assembly, чтобы определить и загрузить сборку, загрузить модуль, указанный в манифесте сборки, найти тип из этой сборки и создать экземпляр этого типа.
(2) Используйте модуль, чтобы понять сборку, содержащую модуль, классы в модуле и т. д., а также получить все глобальные методы, определенные в модуле, или другие конкретные неглобальные методы.
(3) Используйте ConstructorInfo, чтобы понять имя конструктора, параметры, модификаторы доступа (например, общедоступные или частные) и детали реализации (например, абстрактные или виртуальные) и т. д.
(4) Используйте MethodInfo, чтобы понять имя метода, тип возвращаемого значения, параметры, модификаторы доступа (например, общедоступные или частные) и детали реализации (например, абстрактные или виртуальные) и т. д.
(5) Используйте FiedInfo, чтобы понять имя поля, модификаторы доступа (например, общедоступные или частные) и детали реализации (например, статические) и т. д., а также получить или установить значение поля.
(6) Используйте EventInfo, чтобы узнать имя события, тип данных обработчика событий, настраиваемые атрибуты, тип объявления и тип отражения и т. д., а также добавить или удалить обработчики событий.
(7) Используйте PropertyInfo, чтобы понять имя, тип данных, тип объявления, тип отражения, статус свойства только для чтения или записи и т. д., а также получить или установить значение свойства.
(8) Используйте ParameterInfo, чтобы понять имя параметра, тип данных, является ли он входным параметром или выходным параметром, а также местоположение параметра в сигнатуре метода и т. д.
Пространства имен, используемые для отражения:
System.Reflection
System.Type
System.Reflection.Assembly
Основные классы, используемые для рефлексии:
Класс System.Type — через этот класс можно получить доступ к любой заданной информации о типе данных.
Класс System.Reflection.Assembly — его можно использовать для доступа к информации о данной сборке или для загрузки этой сборки в программу.
System.Type своего рода:
Класс System.Type играет центральную роль в отражении. Но это абстрактный базовый класс, Type имеет производный класс, соответствующий каждому типу данных, мы используем методы, поля, свойства объекта этого производного класса, чтобы найти всю информацию об этом типе.
Существует 3 распространенных способа получить ссылку на тип для данного типа:
● использовать C# typeof оператор.
Type t = typeof(string);
● целевая аудитория пользователей GetType() метод.
string s = "grayworm";
Type t = s.GetType();
● также можно позвонить Type статический метод класса GetType() .
Type t = Type.GetType("System.String");
Вышеупомянутые три типа кодов предназначены для получения типа строкового типа.После извлечения ссылки типа строкового типа мы можем использовать t для определения структуры строкового типа.
string n = "grayworm";
Type t = n.GetType();
foreach (MemberInfo mi in t.GetMembers())
{
Console.WriteLine("{0}/t{1}",mi.MemberType,mi.Name);
}
Type Свойства класса:
Название типа данных
Тип данных FullName полное имя (включая имя пространства имен)
Пространство имен определяет имя пространства имен типа данных.
IsAbstract указывает, является ли тип абстрактным.
IsArray Указывает, является ли тип массивом
IsClass указывает, является ли тип классом
IsEnum Указывает, является ли тип перечислением.
IsInterface — указывает, является ли тип интерфейсом.
IsPublic указывает, является ли тип общедоступным.
IsSealed указывает, является ли тип запечатанным классом.
IsValueType указывает, является ли тип типом значения.
Type метод класса:
GetConstructor(), GetConstructors(): возвращает тип ConstructorInfo, который используется для получения информации о конструкторе этого класса.
GetEvent(), GetEvents(): возвращает тип EventInfo, который используется для получения информации о событиях данного класса.
GetField(), GetFields(): возвращает тип FieldInfo, который используется для получения информации о полях (переменных-членах) класса.
GetInterface(), GetInterfaces(): возвращает тип InterfaceInfo, который используется для получения информации об интерфейсе, реализованном этим классом.
GetMember(), GetMembers(): возвращает тип MemberInfo, который используется для получения информации обо всех членах класса.
GetMethod(), GetMethods(): возвращает тип MethodInfo, который используется для получения информации о методах этого класса.
GetProperty(), GetProperties(): возвращает тип PropertyInfo, который используется для получения информации о свойствах класса.
Эти члены можно вызывать, вызывая метод InvokeMember() класса Type или вызывая метод Invoke() классов MethodInfo, PropertyInfo и других.
Проверьте конструктор в классе:
NewClassw nc = new NewClassw();
Type t = nc.GetType();
ConstructorInfo[] ci = t.GetConstructors();**** //Получить все конструкторы класса
foreach (ConstructorInfo c in ci) //обходим каждый конструктор
{
ParameterInfo[] ps = c.GetParameters();// Убираем все параметры каждого конструктора
foreach (ParameterInfo pi in ps) //проходим и печатаем все параметры конструктора
{
Console.Write(pi.ParameterType.ToString()+" "+pi.Name+",");
}
Console.WriteLine();
}
Динамически генерировать объекты с помощью конструкторов:
Type t = typeof(NewClassw);
Type[] pt = new Type[2];
pt[0] = typeof(string);
pt[1] = typeof(string);
//Получить конструктор по типу параметра
ConstructorInfo ci = t.GetConstructor(pt);
//Создаем массив Object как входной параметр конструктора
object[] obj = new object[2]{"grayworm","hi.baidu.com/grayworm"};
//вызов конструктора для создания объекта
object o = ci.Invoke(obj);
//Вызываем метод сгенерированного объекта, чтобы проверить, успешно ли сгенерирован объект
//((NewClassw)o).show();
использовать Activator Создать объект:
Type t = typeof(NewClassw);
// параметры конструктора
object[] obj = new object[2] { "grayworm", "hi.baidu.com/grayworm" };
//Используем статический метод CreateInstance активатора для создания нового объекта
object o = Activator.CreateInstance(t,"grayworm","hi.baidu.com/grayworm");****
//((NewClassw)o).show();
Посмотрите на свойства в классе:
NewClassw nc = new NewClassw();
Type t = nc.GetType();
PropertyInfo[] pis = t.GetProperties();
foreach(PropertyInfo pi in pis)
{
Console.WriteLine(pi.Name);
}
Посмотреть в классе public метод:
NewClassw nc = new NewClassw();
Type t = nc.GetType();
MethodInfo[] mis = t.GetMethods();
foreach (MethodInfo mi in mis)
{
Console.WriteLine(mi.ReturnType+" "+mi.Name);
}
Посмотреть в классе public поле
NewClassw nc = new NewClassw();
Type t = nc.GetType();
FieldInfo[] fis = t.GetFields();
foreach (FieldInfo fi in fis)
{
Console.WriteLine(fi.Name);
}
Используйте отражение для создания объектов и вызывайте свойства, методы и поля для работы****
NewClassw nc = new NewClassw();
Type t = nc.GetType();
object obj = Activator.CreateInstance(t);
//получить поле ID
FieldInfo fi = t.GetField("ID");
//назначаем поле ID
fi.SetValue(obj, "k001");
//Получить свойство MyName
PropertyInfo pi1 = t.GetProperty("MyName");
//Назначаем свойство MyName
pi1.SetValue(obj, "grayworm", null);
PropertyInfo pi2 = t.GetProperty("MyInfo");
pi2.SetValue(obj, "hi.baidu.com/grayworm", null);
//Получить метод показа
MethodInfo mi = t.GetMethod("show");
//вызываем метод шоу
mi.Invoke(obj, null);
System.Reflection.Assembly своего рода
Класс Assembly может получать информацию о сборке, динамически загружать сборки, находить информацию о типе в сборках и создавать экземпляры типа.
Использование класса Assembly может уменьшить связь между сборками, что полезно для рационализации структуры программного обеспечения.
Возврат по имени сборки Assembly объект
****Assembly ass = Assembly.Load("ClassLibrary831");**
****пройти через DLL возврат имени файла Assembly объект
****Assembly ass = Assembly.LoadFrom("ClassLibrary831.dll");
**пройти через Assembly Получить класс в сборке
**Type t = ass.GetType("ClassLibrary831.NewClass"); // **Параметр должен быть полным именем класса
********пройти через Assembly Получить все классы в сборке
Type[] t = ass.GetTypes();
**** // Отражение по названию сборки
**** Assembly ass = Assembly.Load("ClassLibrary831");
Type t = ass.GetType("ClassLibrary831.NewClass");
object o = Activator.CreateInstance(t, "grayworm", "hi.baidu.com/grayworm");
MethodInfo mi = t.GetMethod("show");
mi.Invoke(o, null);
**** // пройти через DLL Полное имя файла отражает все типы в нем
**** Assembly assembly = Assembly.LoadFrom("xxx.dll маршрут ");
Type[] aa = a.GetTypes();
foreach(Type t in aa)
{
if(t.FullName == "a.b.c")
{
object o = Activator.CreateInstance(t);
}
}
- Просмотр свойств, методов и полей класса
private void button1_Click(object sender, EventArgs e)
{
Type type = typeof(Button);
MethodInfo[] infos = type.GetMethods();//Просмотреть методы
foreach (MethodInfo info in infos)
{
listBox1.Items.Add(info.Name);
}
PropertyInfo[] propInfos = type.GetProperties();//Просмотреть свойства
foreach (PropertyInfo info in propInfos)
{
listBox1.Items.Add(info.Name);
}
FieldInfo[] fieldInfo = type.GetFields(BindingFlags.NonPublic);//Поиск непубличных полей
foreach (FieldInfo i in fieldInfo)
{
listBox1.Items.Add(i.Name);
}
}
- Создавайте объекты динамически
Примечание. Имена пространств имен и сборок
namespace SelectClass.Model
{
public class UserInfo
{
public string Name { get; set; }
public int Age { get; set; }
public bool Sex { get; set; }
}
}
private void button1_Click(object sender, EventArgs e)
{
Assembly am = Assembly.Load("SelectClass.Model");//Не нужно добавлять DLL
//Assembly am=Assembly.LoadFrom("SelectClass.Model.dll");
UserInfo info = am.CreateInstance("SelectClass.Model.UserInfo") as UserInfo;
if (info != null)
{
MessageBox.Show("Динамическое создание выполнено успешно!");
}
}
- вызывать метод динамически
private void button1_Click(object sender, EventArgs e)
{
Type ty = typeof(Form1);
MethodInfo info = ty.GetMethod("Do", BindingFlags.Instance | BindingFlags.NonPublic);
info.Invoke(this, null);
}
private void Do()
{
MessageBox.Show("aa");
}