30天C#基础巩固----程序集,反射

一:认识程序集

      只要是使用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");
时间: 2024-10-25 21:49:51

30天C#基础巩固----程序集,反射的相关文章

Java 基础篇之反射

Java 基础篇之反射 反射# 使用反射获取程序运行时的对象和类的真实信息. 获取 Class 对象# 每个类被加载之后,系统会为该类生成一个对应的 Class 对象,通过该 Class 对象可以访问到 JVM 中的这个类. 使用 Class 类的 forName(String clazzName) 静态方法.字符串参数的值是某个类的全限定类名,必须包含完整的包名 调用某个类的 class 属性 调用某个对象的 getClass() 方法.该方法是 java.lang.Object 类中的一个方

【java基础】Java反射机制

一.预先需要掌握的知识(java虚拟机)  1)java虚拟机的方法区:  java虚拟机有一个运行时数据区,这个数据区又被分为方法区,堆区和栈区,我们这里需要了解的主要是方法区.方法区的主要作用是存储被装载的类 的类型信息,当java虚拟机装载某个类型的时候,需要类装载器定位相应的class文件,然后将其读入到java虚拟机中,紧接着虚拟机提取class 中的类型信息,将这些信息存储到方法区中.这些信息主要包括: 这个类型的全限定名 这个类型的直接超类的全限定名 这个类型是类类型还是接口类型

Java基础13:反射与注解详解

Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Oracle官方对反射的解释是 Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fi

Java基础----jdk1.8 反射实验

(写在最前:还没入门的搬砖工的一本正经的胡说八道) 引言:  最近做到的项目中,需要给对接方提供一个公共接口,根据对方传入的XML文件的rootelement分发调用接口,最简单的使用if-else if 模式,但是看着实在太蠢. 场景一:需要根据关键字,进行接口分发 使用if-else模式缺点: 看着蠢 不易阅读(个人观点) 不易维护 balabala...不想编了,就是看着不爽 如果只有一两个方法还好,如果方法多了,额...如下,自行体会. 1 public class TestMethod

学习Spring必学的Java基础知识(1)----反射

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123293 [3] 属性

Type.GetType()在跨程序集反射时返回null

在使用Type.GetType来进行反射的话,情况就复杂些.这是因为Type.GetType是非强类型的.Type.GetType的参数是一个string为类型的完全限定名, 如果在当前程序集中使用: var typeFullName = "CommonBizService.Test"; var type = Type.GetType(typeFullName ); 如果当string表示的目标类型不在当前程序集中,则运行时Type.GetType会返回null. 在网上 找了一些,也

Type.GetType()在跨程序集反射时返回null的解决方法

在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用Type.GetType("BNameSpace.ClassName")在程序集A.dll获取程序集B.dll中的类型,就会返回Null. 关于跨程序集的反射,有两点需要注意: 1.如果使用typeof,编译能通过,则跨程序集的反射一定可以正常运行.可以说,typeof是支持强类型的.比如 1 Type supType = typeof(BNameSpace

学习Spring必学的Java基础知识(1)----反射(转)

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123

C#基础系列:反射笔记

前言:使用反射也有几年了,但是一直觉得,反这个概念很抽象,今天有时间就来总结下这个知识点. 1.为什么需要反射: 最初使用反射的时候,作为小菜总是不理解,既然可以通过new 一个对象的方式得到对象,然后通过对象去调用属性和方法,那么为什么还需要反射去调用呢?后来使用多了发现这就是一个先绑定还是后绑定的问题,很多初使用反射的开发人员通常都会有类似这种疑虑:既然在开发时就能够写好代码,干嘛还放到运行期去做,不光繁琐,而且效率也受影响.博主觉得主要是适用性的问题,如果你的系统没有那么高的扩展性和灵活性