C#之反射

时间:2022-01-13 01:20:38

  C#反射技术主要基于System.Type类和System.Reflection.Assemble类,通过Type类可以访问关于任何数据类型的信息,Assemble类用于访问给定程序集的相关信息,或把这个程序集加载到程序中。

一.System.Type类
  Type类是一个抽象类。只要实例化了一个Type对象,实际上就实例化了Type的一个派生类。尽管一般情况下派生类只提供各种Type方法和属性的不同重载,但是这些方法和属性返回对应数据类型的正确数据,Type有与每种数据类型对应的派生类。它们一般不添加新的方法或属性
  通常,获取指向任何给定的Type引用有三种常用方式:
    *使用typeof运算符,这个运算符的参数是类型的名称,但不放在引号中:
      Type t =typeof(double);
    *使用GetType()方法,所以类都会从System.Object继承这个方法:
      double d =10;
      Type t = d.GetType();
      在一个变量上调用GetType()方法,返回的Type对象只与该数据类型相关,不包含该类型实例的任何信息。
    *调用Type类的静态方法GetType():
      Type t =Type.GetType("System.Double");

  Type是很多反射功能的入口,它实现很多方法和属性,可用的属性都是只读的:可以使用Type确定数据的类型,但不能使用它修改该类型。

  1.Type属性
  由Type实现的属性分为3类。
  *包含与类相关的各种名称的字符串:
    Name:数据类型名
    FullName:数据类型的完全限定名(包含名称空间)
    Namespace:在其中定义数据类型的名称空间名
  *获取Type对象的引用的属性:
    BaseType:该对象的直接基本类型
    UnderlyingSystemType:该Type在.NET运行库中映射到的类型
  *布尔属性
    IsAbstract,IsArray,IsClass,IsEnum等判断Type是什么类型的属性。

  2.方法
  System.Type的大多数方法都用于获取对应数据类型的成员信息:构造函数,属性,方法和事件等。它有许多方法,但它们都有相同的模式。例如,获取数据类型的方法的信息:GetMethod()和GetMethods()。GetMethod()方法返回MethodInfo对象的一个引用,其中包含一个指定方法的细节信息;而GetMethods()返回这种引用的一个数组。

C#之反射



二.Assembly类
  Assembly类允许访问给定程序集的元数据,它也包含可以加载和执行程序集(假定该程序集是可执行的)的方法。与Type类一样,Assembly类包含非常多的方法和属性,,这里只介绍与特性()有关的成员,其它成员可以去MSDN(https://msdn.microsoft.com/zh-cn/library/system.reflection.assembly(v=vs.100).aspx)查看。
  

C#之反射

  

C#之反射

  

C#之反射



  在使用Assembly实例做一些工作前,需要把相应的程序集加载到正在运行的进程中。可以使用静态方法Assembly.Load()或Assembly.LoadFrom()。Load()方法的参数程序集的名称,运行库会在各个位置上搜索该程序集,这些位置包括本地目录和全局程序集缓存。而LoadFrom()方法的参数是程序集的完整路径名,它不会在其它位置搜索该程序集:
  Assembly assembly1 = Assembly.Load(“WhatsNewAttributes");
  Assembly assembly2 = Assembly.LoadFrom(“E:\WhatsNewAttributes\bin\Debug\WhatsNewAttributes");
  这两个方法都有许多其它重载版本。

  1.获取在程序集中定义的类型的详细信息
  Assembly类调用GetType()方法可以获得相应程序集中定义的所有类型的详细信息,它返回一个包含所有类型的详细信息的System.Type引用数组:
    Type[] types = assembly1.GetType();

    foreach(Type t in types)
    {

    }

  2.获取自定义特性的详细信息
  如果需要确定程序集关联了什么自定义特性,就需要调用Attribute类的一个静态方法GetCustomAttributes():
    Assembly assembly1 = Assembly.Load(“WhatsNewAttributes");
    Attribute[] attribs = Attribute.GetCustomAttributes(assembly1);
  GetCustomAttributes方法用于获取程序集的特性,他有两个重载方法:如果在调用它时,除了程序集的引用外,没有其它参数,该方法就会返回这个程序集定义的所以自定义特性;如果指定第二个参数,第二个参数表示特性类的一个Type对象,GetCustomAttributes方法返回指定特性类型的特性数组。
  所有的特性都作为一般的Attribute引用来获取。如果需要调用为自定义特性定义的任何方法或属性,就需要把这些引用显示转换为自定义特性类。
  如果要获得与方法,构造函数和字段等的特性,就需要调用MethodInfo,ConstructorInfo,FieldInfo等类的GetCustomAttributes()方法。

  下面通过一个例子演示,自定义特性和反射
  1.编写自定义特性