1、反射就是动态获取程序集的元数据的功能 没有通过添加引用 和使用使用using就是用的反射原理
2、Type 类实现反射的一个重要的类
ctrl+shift + f12
// 加载程序集文件 AppDomain.CurrentDomain.BaseDirectory 获得exe 所在目录的根路径
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Common.dll");
// 首先加载程序集
Assembly ass = Assembly.LoadFile(path);
// 获得所有公开的数据 GetExportedTypes
Type[] types = ass.GetExportedTypes();
foreach (var item in types)
{
Console.WriteLine(item.Name);
Console.WriteLine(item.FullName);
Console.WriteLine(item.Namespace);
}
// 获得所有的类数据(包括私有的)
Type[] types = ass.GetTypes();
// 通过对象 获得指定的 name 类型信息
Type t = ass.GetTypes(“name”);
// 通过类获得Type: Type t = typeof(Person)
二,动态创建对象
/ / 动态创建对象 // 这个方法 CreateInstance 默认调用的是无参构造函数
object ob = ass.CreateInstance("Common.Person");
// 调用有参构造函数
Type type = ass.GetType("Common.Person");
object o = Activator.CreateInstance(type, 18, "张三");
// 获得当前类的所有属性
PropertyInfo[] info = o.GetType().GetProperties();
foreach (var item in info)
{
Console.WriteLine(item.Name);
}
// 获得程序集的所有方法
MethodInfo[] methodInfo = o.GetType().GetMethods();
foreach (var item in methodInfo)
{
Console.WriteLine(item);
}
如何通过反射去执行函数呢?
// 获得要调用的函数
MethodInfo me = o.GetType().GetMethod("showAll");
// invoke 执行函数
me.Invoke(o, null);
Type类的方法
bool isAssignableFrom(Type c) : 直译 是否可以从c赋值 判断当前的类型变量是不是可以接受c
类型的赋值
bool IsInstanceOfType(object o) : 判断对象o是当前类的实例
bool isSubclassOd(Type c) 判断当前类的子类 没有借口的事
isAbstract 判断是否为接口