C# 特性和反射

来源:互联网 发布:深睡眠和浅睡眠 知乎 编辑:程序博客网 时间:2024/05/21 09:44

特性的概念
特性是一种允许我们向程序的程序集增加元数据的语言结构,他是用于保存程序结构信息的某种特殊类型的类。
将应用了特性的程序结构叫做目标
设计用来获取和使用元数据的程序叫做特性的消费者
.NET预定了很多特性,我们也可以声明自定义特性

什么是元数据?什么是反射?
1、程序是用来处理数据的,文本和特性都是数据,而我们程序的本身也是数据
2、有关程序及其类型的数据被称为元数据,他们保存在程序的程序集中
3、程序在运行时可以查看其他程序集或其本身的元数据,一个运行的程序查看本身的元数据或者其他程序集的元数据的行为叫做反射

Type类
Type位于Syatem.Reflection命名空间下
预定义类型(int和long、string等 ),BCL的类型(Console,IEnumerable等)
Type类是抽象类,不能实例化对象

注意事项:

对于程序中用到的每一个类型,CLR都会创建包含这个类型信息的Type类型的对象程序中用到的每一个类型都会关联到每一个独立的Type类的对象

不管创建的对象有多少个实例,只有一个Type对象会关联到所有的这些实例

获取Type对象

1、Type t=myInstance.GetType();通过类的实例来获取Type对象

在object类有一个GetType方法,返回Type对象,所有的Type类都是从Object类继承的,所以我们可以在任何类型上使用GetType()来获取他的Type对象

2、Type t=typeof(直接通过typeof运算符和类名获取Type对象)

总结:通过Type对象可以获取它对应的类的所有公有的成员成员

首先创建一个MyCliass类

 class MyClass  {    private int id;     public int age;     private string name; public string Name  {    get    {         return name;    }   set   {     name = value;   }}     public void Text1()     {    }      public string Text2()    {                    return "你好";    }}

在主函数中通过Type对象获取类中的成员

static void Main(string[] args)    {        //每一个类对应一个type对象,这个type对象存储了这个类的方法、数据和成员        MyClass my = new MyClass();//一个类中的具体的数据是存储在对象中的,但type对象只存储类的成员        Type type = my.GetType();//通过对象获取这个对象所属类的type对象        Console.WriteLine(type.Name);//类名         Console.WriteLine(type.Namespace);//命名空间         Console.WriteLine(type.Assembly);//获取对象所在的程序集         FieldInfo[] array = type.GetFields();//获取类中所有公有的字段        foreach (FieldInfo temp in array)        {            Console.Write(temp.Name + "  ");        }        PropertyInfo[] array2 = type.GetProperties();        foreach (PropertyInfo info in array2)        {            Console.Write(info.Name + "  ");//获取类中所有属性        }        MethodInfo[] array3 = type.GetMethods();        foreach (MethodInfo info in array3)        {            Console.Write(info.Name + "  ");            //获取类中所有方法和跟类相关联的类中的所有方法        }        Console.ReadKey();    }

Assembly类
Assembly类在System.Reflection命名空间中定义,它允许访问给定程序集的元数据,它也包含了可以加载和执行程序集

如何加载程序集
1、Assembly assembly1=Assembly.Load(“SomeAssembly”);根据程序集名字加载程序集,它会在本地目录,和全局程序集缓存目录查找符合名字的程序集

2、Assembly assembly2=Assembly.LoadFrom(@”c:\xx\xxSomeAssembly.dll”)这里的参数是程序集的完整路径名,他不会在其他位置搜索

Obsolete特性
Obsolete特性简单来讲就是当一些旧的方法已经过时的时候,提示程序猿使用新方法替代旧方法,但是旧方法仍然可以使用

class Program {         [Obsolete("这个方法过时了,请使用NewMethod()代替")]//该特性表示一个方法被弃用了,但是仍然可以被使用static void OldMethod(){ }static void NewMethod()        {           Console.WriteLine("新方法");        } static void Main(string[] args)        {           OldMethod();           Console.ReadKey();          }//当光标移动到被调用的旧方法上的时候,系统就会提示旧方法已经过时class Program      {          [Obsolete("这个方法过时了,请使用NewMethod()代替", true)]//该特性表示一个方法被弃用了,但是仍然可以被使用          //bool值参数表示是否能调用旧方法,true时不能调用,系统会报错static void OldMethod()          {              Console.WriteLine("旧方法");          }static void NewMethod()          {             Console.WriteLine("新方法");          } static void Main(string[] args)          {             OldMethod();             Console.ReadKey();           }       }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为荣耀P9进水了怎么办 苹果5s手机信号不好怎么办 苹果5s信号不好怎么办? 苹果5s像素不好怎么办 华为mate边缘有缝怎么办 华为mate8边缘有缝怎么办 手机系统占用运行内存大怎么办 安卓手机储存空间不足怎么办 手机显示系统空间不足怎么办 联系人存储已停止运行怎么办 荣耀note8听筒声音小怎么办 红米4x内存不足怎么办 安卓电视内存小怎么办 红米手机运行内存不足怎么办 红米手机存储空间不足怎么办 华为手机储存空间不足怎么办 大麦机顶盒遥控器丢了怎么办 大麦盒子总自动加软件怎么办 小米手机玩王者荣耀卡怎么办 荣耀8青春版信号差怎么办 华为mate8电池不耐用怎么办 华为4x内存小怎么办 发现手机被用过怎么办 华为p8手机声音小怎么办 手机指纹解锁密码忘了怎么办 华为p10黑色掉漆怎么办 金立手机导航信号弱怎么办 手机导航时gps信号弱怎么办 三星手机导航gps信号弱怎么办 小米5导航信号弱怎么办 华为手机导航gps信号弱怎么办 手机屏玻璃裂了怎么办 oppo音量键坏了怎么办 魅蓝手机屏幕碎了怎么办 手机钢化膜边缘有气泡怎么办 手机贴钢化膜边缘有气泡怎么办 苹果手机钢化膜边缘有气泡怎么办 手机膜里的水泡怎么办 膜贴好了有气泡怎么办 后档玻璃膜气泡怎么办 贴膜里面有灰尘怎么办