首页 / C# / 30天C#基础巩固----程序集,反射
30天C#基础巩固----程序集,反射
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了30天C#基础巩固----程序集,反射,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2513字,纯文字阅读大概需要4分钟。
内容图文
一:认识程序集
只要是使用VS就会和程序集打交道,我们通过编辑和生产可执行程序就会自动生成程序集。那么什么事程序集呢,.net中的dll与exe文件的都是程序集(Assembly)。
可以看做是一堆相关类打包的包,相当于java中的jar包(*);
程序集包含:类型元数据,程序集元数据,IL代码,资源文件
类型元数据:描述在代码中定义的每一类型和成员的二进制形式。
程序集元数据:程序集清单,版本号,名称等;
IL代码:被微软封装到了exe和IL中。
资源文件:每个程序集都有自己的名称,版本等信息,都可以通过AssemblyInfo.cs文件来自己定义。
好处:程序中只引用必须的程序集,减小程序的尺寸。可以封装一个代码,只提供必要的访问接口。
二:反射学习
反射看似很高深,听起来不太的容易理解,但是我们要是经常的使用它,那就会变得很简单。
vs的智能提示就是通过反射来获取到类的属性,方法等,还有反编译工具也是。
定义:反射就是动态的获取程序集中的元数据来操作类型的。反射就是直接通过调用.dll来创建对象,调用成员的。通过类型元数据来获取对象的一些相关信息,并且还可以实例化对象调用方法等,这个就是反射。
Type类是实现反射的重要类,通过它可以获取到类中的所有信息包括方法,属性等,可以动态的调用类,方法,Type是对类的描述,反射让创建对象的方式发生了变化。
- Assembly里面存储的是我们调用程序集的一些东西,我们通过这个类来进行调用程序集。
- 通过 Activator.CreateInstance()来使用反射创建实例化对象。返回的是object类型。
- 通过 minfo.Invoke(object,null)来调用类库中的方法。第一个是对象类型,第二个是我们调用方法的参数列表。
eg1:
读取Clb.dll文件,读取里面所有的类(Type)。
Clb.dll文件
namespace Clb { public class Class1 { //属性 private int Age { get; set; } //方法 public void SayHi() { Console.WriteLine("你好世界 ?"); } //接口 public interface IFlyable { void Fly(); } //委托 public delegate void MyDelegate(); } }
main()方法
static void Main(string[] args) { //通过Assembly来取到本地的程序集。 Assembly asm = Assembly.LoadFile("C:/Clb.dll"); //注意它的返回值 Type[] type=asm.GetTypes(); //得到所有的类型,注意返回值。 foreach (Type item in type) { Console.WriteLine(item.Name); } Console.Read(); }
获取只有public类型的
//只获取public类型 Type[] type = asm.GetExportedTypes();
出现错误如下,解决办法是我们的设置有问题,在调试--选项和设置---常规(下图),这样就可以读取到本地的dll文件了。
eg:加载Class1中的所有方法。
//加载程序集 Assembly asm = Assembly.LoadFile("C:/Clb.dll"); //获取Class1下这个类型,typeclass描述Class1类的type,里面存储的是class1的一些相关信息,。 Type typeclass= asm.GetType("Clb.Class1"); //获取class1中的所有方法 ,注意返回值。 MethodInfo[] minfo= typeclass.GetMethods(); foreach (MethodInfo item in minfo) { Console.WriteLine(item.Name); } Console.Read();
下面图片里面的方法我们的类中没有,那是我们object基类的一些公共方法。
eg:
通过反射来创建对象,调用类库中的方法。
//1:加载程序集 Assembly asm = Assembly.LoadFile("C:/Clb.dll"); //2:获取Class1下这个类型,typeclass描述Class1类的type,里面存储的是class1的一些相关信息,。 Type typeclass= asm.GetType("Clb.Class1"); //3:获取class1中的所有方法 ,注意返回值。 MethodInfo minfo = typeclass.GetMethod("SayHi"); Console.WriteLine(minfo.Name); //创建一个Class1类型对象 object obj = Activator.CreateInstance(typeclass); //通过反射来调用方法 minfo.Invoke(obj, null); Console.Read();
三:Type类的使用
通过类获取Type;通过对象获取类的Type,通过Assembly类获取Type。
Person p=new Person(); //通过基类的GetType类获取Type Type t= p.GetType(); //通过typeof来获取。 Type ts = typeof (Person); //通过程序集来获取; Assembly asm = Assembly.LoadFile("C:/Clb.dll"); Type tss = asm.GetType("Clb.dll.Person");
原文:http://www.cnblogs.com/netxiaohui/p/5562388.html
内容总结
以上是互联网集市为您收集整理的30天C#基础巩固----程序集,反射全部内容,希望文章能够帮你解决30天C#基础巩固----程序集,反射所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。