记录一下放射的一些东西把,之前都是学了记在笔记本上,现在整理上来,当作是复习和知新。
微软参考文档:
https://docs.microsoft.com/zh-cn/dotnet/framework/reflection-and-codedom/reflection
反射的实现主要依赖于微软提供的两个命名空间:System.Reflection 和System.Type 两个命名空间:
反射:就是动态的获取程序集,并获取其中类型的元数据,然后访问该类型的过程。
可以在运行时 创建 访问 调用 类型。
反射在实际应用中通常被用于: 深复制实现,数据库DataTable 转换成执行的类型 等。
情况①:当我们不知道对象的时候(T)我们通常使用下面的方式来获取某个类型的Type
Type type=typeof(T);
情况②:当我们已知某个对象的时候 我们可以直接使用GetType(),方法来获取指定对象类型的Type对象
如:
Person p=new Person();
Type personType=p.GetType();
1:获取类中的所有方法(不包括私有方法)
MethodInfo[] methods=type.GetMethods();
2:获取某个类型的所有属性(私有属性也无法获取到)
PropertyInfo[] propertyInfo=type.GetProperties();
3:获取类型的所有字段(私有字段也无法获取到)
FieldInfo[] fields=type.GetFields();
4:获取所有成员,不包括私有成员
MemberInfo[] memberInfos=type.GetMembers();
#通过反射来获取一个程序集的类型
1:动态加载 .dll文件
Assembly assembly=Assembly.LoadFile(@"文件路径")
2:获取刚刚加载的程序集中的所有类型
Type[] type=assembly.GetTypes();
3:获取访问修饰符为 public的类型
Type[] type =assembly.GetExportedTypes();:
4:获取某个类的Type
Type type=assembly.GetType("命名空间.类名");
5:根据4中的type获取某个特定的方法(根据方法名)
MethodInfo method=type.GetMethod("方法名");
7:调用这个方法
method.Invoke()
8:通过反射来 创建某个类型的对象(其实就是通过类型的Type 来创建该类型的对象)
object obj=Activator.CreateInstance(type);
method.invoke(obj,null)
三:通过反射获取类的属性,并赋值
1:获取Name属性
PropertyInfo property=type.GetProperty("Name");
object obj=Activator.CreateInstance(property);
2:为属性赋值
property.SetValue(obj,"姓名",null)
3:获取属性
string property=property.GetValue(obj,null).toString();
四:构造函数
ConstructorInfo ctor=type.GetConstructor(new Type[]{typeof(string),typeof(int)})
调用构造函数
object obj=ctor.Invoke(new object[]{"asdf","asdfas","125"});
示例代码后面 在补充,先这样。