美文网首页
几句话说明白c#反射

几句话说明白c#反射

作者: 午字横 | 来源:发表于2024-08-29 16:01 被阅读0次

    有关程序及其类型的数据称为元数据,它们保存在程序的程序集中;
    运行中的程序查看本身的元数据或者其它程序的元数据的行为称---反射;

    要使用反射,必须使用system.reflection命名空间;

    Type类

    BCL(base class library:基类库)中声明了Type类,它被设计用来包含类型的特征,只用它能获取程序使用类型的信息。
    Type是抽象类,因此不能有实例。在运行时,CLR创建Type(RuntimeType)派生类的实例,Type包含类型信息。当访问这些实例时,CLR不会返回派生类的引用而是返回Type基类的引用。

    对于程序中的每一个类型,CLR都会创建一个包含这个类型信息的type类型对象;
    不管创建的类型有多少个实例,只有一个Type对象会关联到所有的这些实例;

    我们几乎可以从Type对象中获取有关类型的所有信息。

    using System.Reflection;
    
    void Main()
    {
        var bc = new BaseClass();
        var ab = new A();
    
        //BaseClass[] lst=new UserQuery.BaseClass[]{bc,ab};
        //foreach (var element in lst)
        //{
        //  Type type = element.GetType();
        //  Console.WriteLine($"object type :{type.Name}");
        //  FieldInfo[] fi=type.GetFields();
        //  foreach (var f in fi)
        //  {
        //      Console.WriteLine($"field :{f.Name}");
        //  }
        //}
        Type type = typeof(BaseClass);
        type.Name.Dump();
        //type.GetFields()[0].Dump();
        FieldInfo fi = type.GetField("ID",BindingFlags.NonPublic | BindingFlags.Instance);
        if (fi != null)
        {
            fi.SetValue(bc, 200);
            // 由于ID是私有的,无法直接访问,这里我们使用反射来读取它
            int idValue = (int)fi.GetValue(bc);
            Console.WriteLine(idValue);
        }
        else
        {
            Console.WriteLine("Field not found.");
        }
    }
    
    class BaseClass
    {
        private int ID=0;
    }
    
    class A : BaseClass
    {
        //public int ID =0;
        //public string Name ="daming";
    }
    

    获取Type对象

    object类型包含一个叫做GetType()的方法,它返回对实例的Type对象的引用。由于每一个类型最终都是从object中派生的,所以我们可以在任何类型上使用后GetType()方法获取它的type对象。

    class baseClass{}
    Type bc=new baseClass();    
    bc.GetType();                //获取类型
    
    Type bc=typeof(baseClass);    //获取类型
    bc.Name.Dump();
    

    2024-08-30

    相关文章

      网友评论

          本文标题:几句话说明白c#反射

          本文链接:https://www.haomeiwen.com/subject/ewuxljtx.html