欢迎光临散文网 会员登陆 & 注册

C#_反射与特性

2022-02-11 11:27 作者:Pan_ana  | 我要投稿
  • 程序集

  1. 经过编译器编译得到的产物(.exe/.dll)

  2. 是自己写的代码集合

  • 元数据

  1. 用来描述程序集的数据单元

  • 反射

  1. 可以在程序运行时,可以查看其他程序集或者自身的元数据

  2. 提高了程序的拓展性和灵活性

  3. using System.Reflection命名空间下

  4. using System

  1. Type【类的信息类】

  2. Assembly【程序集类

  3. Activator【实例化对象的类】

  1. .GetType();//在xx命名空间下的.xx

  2. Type t=typeof(int);//在xx命名空间下的xx

  3. Type.GetType();//【参数】System.Int32(需要包含命名空间)

以上的三种方法指向的是同一个引用内存地址

  1. 得到所有的公共成员】:MemberInfo[] m=t.GetMembers();

  1. 得到所有的构造方法】:ConstructorInfo[] info=t.GetConstructors();

    得到一个的构造方法】:ConstructorInfo info=t.GetConstructor(new Type[0]);【参数】有长度的Type类型数组,长度0则为无参构造。 info.Invoke();//【参数:null】执行得到的构造方法,返回object对象(需要as得到引用对象)

    得到有参的构造方法】:ConstructorInfo info=t.GetConstructor(new Type[]{typeof(int)}); //一个int类型的构造方法;info.Invoke(new Type[]{2}); //【参数】传入2返回object对象(需要as得到引用对象){同理:两个参数的构造函数时,需要按照顺序typeof(int),typeof(string)}

  2. 得到所有的成员变量】:FieldInfo[] f=t.GetFields();

    得到一个成员变量】:FieldInfo f=t.GetField("age");//【参数】变量名得到引用

    得到成员变量的内容】:f.GetValue(obj);//【参数】为该变量类型的实例

    【设置成员变量的内容】:f.SetValue(obj,10);//【参数】1.实例2.更改obj的值,若[枚举则为.GetValue(null),先得成员后访问]

  3. 得到公共的成员方法】:Method[] f=t.GetMethods();//得到对应有参数的成员方法和构造方法的方式一致

    得到一个成员方法】:Method f=t.GetMethod("FunName");//【参数】方法名得到引用,f.Invoke(类型实例(如果为静态方法为null),new Type[]{10,10});

  4. 【枚举、事件、接口】

  1. Activator实例化

    1. 得到Type t=typeof(MyClass);

    2. Activator.CreateInstance(t);//【参数】为对象信息类,返回object对象(需要as)默认为无参构造

    3. Activator.CreateInstance(t,2,“222”);//【参数】为对象信息类,返回object对象(需要as)默认为无参构造,后面为对应参数,不对应则报错

  2. Assembly【程序集类

    1. Assembly asem= Assembly.Load();//同个工程文件下程序集名称

    2. Assembly asem= Assembly.LoadFrom();//加载指定路径下的.dll【使用@取消转移字符或者\\】用Type[]进行装置遍历

    3. Assembly asem= Assembly.LoadFile();

  • 特性


  1. What

    1. 是一种允许我们向程序的程序集添加一些元数据的语言结构,用于保存程序结构信息的某种特殊类型的类

    2. 提供了强大的方法声明信息与代码的其他元数据相关联,可以在运行时使用反射来查询特性的相关信息描述

    3. 目的是提供编译器把某些元数据进行特殊处理,本质是一个类

  2. Why

    1. 提供某些特殊需求

  3. How

    1. 定义】该类需要继承Attribute才能自定义特性名字后面需亚添加Attribute表示是特性,在使用时Attribute会被省略

    2. 调用

      1. [MyTest("特性测试")],判断Type对象有没有有没有对应的特性,t.IsDefined(typeof(自定义的特性类名),bool是否搜索继承链)//可以传成员等

      2. t.GetCustomAttribues(ture)//获取元数据中的所有特性 返回object对象数组可以遍历去判断做特殊处理(as 为对应的类进行调用对应的成员)

    3. 限定使用范围】为特性类再加[AttributeUsage()][参数]1.可以使用在哪里可以用位运算符进行处理2.是否多个特性实例用在同一个目标上3.特性是否能被派生类重写和继承

    4. 过时特性】[obsolete("该方法已经过时,请使用GetAaxis方法",bool调用是否会报错)]

    5. 调用者信息特性】一般用在处理异常的Try中,System.Runtime.CompilerServices;

    6. 条件编译特性】[Conditional("Fun")]System.Diagnostic,结合#define Fun进行使用,主要用在调试代码

    7. 外部Dll包特性】System.Runtime.InteropServices;//调用C/C++写好的函数,[DllImport(“路径.dll”)]

      public static extern int Add(int a,int b);//进行函数映射


C#_反射与特性的评论 (共 条)

分享到微博请遵守国家法律