zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C# 特性和反射

c#反射 特性
2023-09-11 14:20:51 时间

特性的概念
特性是一种允许我们向程序的程序集增加元数据的语言结构,他是用于保存程序结构信息的某种特殊类型的类。
将应用了特性的程序结构叫做目标
设计用来获取和使用元数据的程序叫做特性的消费者
.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();
           }
       }