首页 / C# / C#反射Reflection
C#反射Reflection
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#反射Reflection,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2606字,纯文字阅读大概需要4分钟。
内容图文
反射就是动态获取程序集中的元数据,直接通过.dll来创建对象,调用成员。
Type是反射一个重要的类。通过Type获取类中所有信息,包括方法,属性等。
一、Type的简单使用
1.通过typeof(类型名)或类实例.GetType()的方式获取某个类型的Type。
2.通过GetFields方法可以获取类型中的所有属性。
3.Activator.CreateInstance(类型的Type)可以创建类型的实例。
4.IsInstanceOfType(),判断是否是某一类型的的实例。
5.IsAssignableFrom(),判断是否能将后者类型的实例赋值给前者类型。
6.IsSubclassOf(),判断某一对象类型是否为“抽象类”,这里的抽象类指的是不可以实例化的类。
7.BaseType,获取父类的类型。
二、反射Reflection
1.通过Assemly.LoadFile()静态方法加载一个程序集,程序集可以看作是封装了很多类的文件。
2.GetTypes获取程序集中所有的类,GetType()获取指定类名的类,这是需要指定类的全名,即程序集的名字+类的名字。
3.GetExportedTypes(),获取所有的公有类,这个方法是访问不到私有类的。
5.GetMehod(),这里需要注意的是,如果搜索的方法有重载,直接通过方法名来搜索是找不到的,
这里需要通过第二个参数来选择,类型为Type[],如果想查找没有参数的方法,定义为new Type[]{}即可,不需要写任何的数据。
如果有参数,则按顺序写好即可。
6.通过MethodInfo的Invoke()方法来执行搜索到的方法,这里需要传入一个对象用来指示是那个类型的方法,还需要传入参数,这个方法是不存在1个参数的重载的,
处理方法和第5点一样,如果没有则写成new object[]{}即可。
7.GetProperty()搜索指定的属性,类型为PropertyInfo。
8.PropertyInfo通过GetValue()获取属性的值,SetValue()获取属性的。
9.创建实例的两种方法
a.Activator.CreateInstance(),但是Activator属性System命名空间,不知是否属于反射的方法。
b.通过构造函数的方法创建,由上述可以,通过Type可以获得指定类型的方法,则就可以获取到构造函数,
系统已经继承了GetConstructor()的方法,猜想内部应该也通过GetMethod实现的,这样通过执行搜索到
的构造函数就可以获取到相应类型的实例了。
10.总结
a.认情况下,GetMothod和GetProperty都是请求不到类的私有成员的,由方法的重载可知,这两个方法的重载中
都有BindingFlags的枚举选项,并且这个枚举还是标志枚举,枚举成员之间不是相互排斥的,而是互相兼容的。
它们可以同于与或非的操作来满足业务的需要。这里就把这个枚举设置为BindingFlags.NonPublic|BindingFlags.Instance,
表示为搜索匹配为非公共类型和实例类型,这样就会把私有类型加入到搜索范围内。
b.很多方法的重载方式一致通用的,例如在执行方法、搜索方法和搜索构造函数时,都需要传入数组类型的对象,
这时如果没有参数,则直接声明不进行赋值即可。
c.搜索到的类是可以转换为原本类型的实例的,通过as方法会对返回null时不报错。
d.反射是在线升级软件的一种方式,可以在初始版本中留下读取的程序集的“接口”,而程序集需要按照约定的形式书写。
这样每当有程序集放入时,程序启动来,就会去读取dll文件,并根据其中的内容做出相应的“升级”。
Assembly asm = Assembly.LoadFile(@"G:\test\demo\myLibClass\bin\Debug\myLibClass.dll"); //获取所有的类 Type[] types = asm.GetTypes(); for (int i = 0; i < types.Length; i++) { textBox1.AppendText(types[i].Name + "\r\n"); } //获取所有的公有类 Type[] t1 = asm.GetExportedTypes(); for (int i = 0; i < t1.Length; i++) { textBox1.AppendText(t1[i].Name + "\r\n"); } //获取指定的类型 需要填写全名 即命名空间+类名 Type t2 = asm.GetType("myLibClass.student"); //获取类型的某个方法 MethodInfo m1 = t2.GetMethod("sayHi", new Type[] { }); t2.GetMethod("", BindingFlags.NonPublic | BindingFlags.Instance); t2.GetProperty("", BindingFlags.NonPublic | BindingFlags.Instance); //根据类型创建对象 object obj = Activator.CreateInstance(t2); string sss = m1.Invoke(obj, new string[] { }) as string; //获取类型的构造函数 ConstructorInfo info = t2.GetConstructor(new Type[] { }); //通过执行构造函数创建对象 object stu = info.Invoke(obj, new object[] { }); //获取属性 PropertyInfo pinfo = t2.GetProperty("id"); //设置属性的值 null表示该属性不是索引索性 string id = pinfo.GetValue(obj, null).ToString();
原文:http://www.cnblogs.com/xiaoai123/p/6938776.html
内容总结
以上是互联网集市为您收集整理的C#反射Reflection全部内容,希望文章能够帮你解决C#反射Reflection所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。