反射的常用类:
->Type类:设计用来包含类型的特性,可以获取程序中使用的类型信息。(获取一个类包含的成员和方法)。
Type类可以根据实例获取类的名称、所属命名空间、是否为公共类、以及类的字段、属性、方法等信息;
public void Test1()
{
Car _car = new Car();
Type typeCat = _car.GetType();//获取当前实例的类型
typeCat.Name;//获取类的名称
typeCat.NameSpace;//获取类所属命名空间
typeCat.Assemnly;//获取所属程序集
FieldInfo[] fileArray = typeCat.GetFields();//获取字段信息
foreach (FieldInfo item in fileArray) {
Console.WriteLine(item.Name);
}
MethodInfo[] methodInfos = typePerson.GetMethods();//获取方法信息
foreach (MethodInfo item in methodInfos) {
Console.WriteLine(item.Name);
}
PropertyInfo[] propertyInfos = typePerson.GetProperties();//获取属性信息
foreach (PropertyInfo item in propertyInfos) {
Console.WriteLine(item.Name);
}
}
->Assembly类:得到一个程序集中反射信息。
程序集存在形式:.dll文件、.exe文件
加载程序集:
Assembly assembly =Assembly.LoadFrom(@"D:\Cu111_cv440_dnn821\emgu4.4.0\Emgu.CV.dll");
Type[] ty = assembly.GetTypes();//获取程序集中所有的类
foreach (Type item in ty) {
Console.WriteLine(item.Name);
}
->使用反射来动态调用
1)无参方法的调用
//通过反射,调用无参的方法
public void Test4()
{
string className = "Person";//类名称字符串
string methodName = "DisplayAge";//方法名称字符串
//获取程序集类型
Assembly assembly = Assembly.LoadFrom(@"E:\反射.exe");
//获取type 类
Type typeclass = assembly.GetType("反射." + className);//通过类名字符串获取**类型声明**
object obj = Activator.CreateInstance(typeclass);//根据类型声明创建类的对象
//根据方法名称获取该对象中的方法
MethodInfo methodInfo = typeclass.GetMethod(methodName);
//调用无参方法
methodInfo.Invoke(obj, null);
Console.ReadLine();
}
2)有参方法的调用
//通过反射,调用有参方法
public void Test5()
{
string className = "Person";//类名称字符串
string methodName = "DisplayAge";//方法名称字符串
//获取程序集
Assembly assembly = Assembly.LoadFrom(@"E:\反射.exe");
//获取type 类
Type typeclass = assembly.GetType("反射." + className);//通过类名字符串获取类型声明
object obj = Activator.CreateInstance(typeclass);//根据类型声明创建类的对象
//根据方法名称获取该对象中的方法
MethodInfo methodInfo = typeclass.GetMethod(methodName);
object[] objPara = new object[1];
objPara[0] = 23;//参数
//调用有参方法
methodInfo.Invoke(obj, objPara);
Console.ReadLine();
}
3)有参方法的调用–重载
//通过反射,调用有参方法--重载
public void Test6()
{
string className = "Person";//类名称字符串
string methodName = "DisplayAge";//方法名称字符串
//获取程序集
Assembly assembly = Assembly.LoadFrom(@"E:\反射.exe");
//获取type 类
Type typeclass = assembly.GetType("反射." + className);//通过类名字符串获取类型声明
object obj = Activator.CreateInstance(typeclass);//根据类型声明创建类的对象
Type[] types = { typeof(int) };//提供重载的函数其参数类型
//根据方法名称获取对象中的方法
MethodInfo methodInfo = typeclass.GetMethod(methodName,types);
object[] objPara = new object[1];
objPara[0] = 1000;//参数
//调用有参方法
methodInfo.Invoke(obj, objPara);
Console.ReadLine();
}
4)私有方法的调用
//通过反射,调用私有方法
public void Test7()
{
string className = "Person";//类名称字符串
string methodName = "DisplayPrivate";//方法名称字符串
//获取程序集
Assembly assembly = Assembly.LoadFrom(@"E:\反射.exe");
//获取type 类
Type typeclass = assembly.GetType("反射." + className);//通过类名字符串获取类型声明
object obj = Activator.CreateInstance(typeclass);//根据类型声明创建类的对象
//根据方法名称获取该对象中的私有方法
MethodInfo methodInfo = typeclass.GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
//调用私有方法
methodInfo.Invoke(obj, null);
Console.ReadLine();
}
5)属性调用
//通过反射,调用属性
public void Test8()
{
string className = "Person";//类名称字符串
string proName = "Name";//方法名称字符串
//获取程序集
Assembly assembly = Assembly.LoadFrom(@"E:\反射.exe");
//获取type 类
Type typeclass = assembly.GetType("反射." + className);//通过类名字符串获取类型声明
object obj = Activator.CreateInstance(typeclass);//根据类型声明创建类的对象
//获取属性
PropertyInfo propertyInfo = typeclass.GetProperty(proName);
//给属性赋值
propertyInfo.SetValue(obj, "zhang");
//获取属性值
string str = propertyInfo.GetValue(obj, null).ToString();
Console.WriteLine(str);
Console.ReadLine();
}
->Type类深入方法
bool IsAssignableFrom(Type c);//判断段一个类/接口,是否是另一个类的父类或者接口
bool IsInstanceOfType(Object obj);//判断一个类是否是当前类的实例,或者实现接口
bool IsSubclassOf(Type c);//判断当前类是否是(参数)类的子类