• C# 反射(一)基础概念


    一、C# 反射(refection)基础概念

    反射指程序可以访问、检测和修改它本身状态或行为的一种能力。

    程序集包含模块,而模块包含类型,类型又包含成员。

    反射则提供了封装程序集、模块和类型的对象。

    您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。

    反射提供了封装程序集、模块和类型的对象(反射的层次模型为:程序集包含模块,而模块包含类型,类型又包含成员【成员--->类型--->模块--->程序集】)其中类型可以是(类、结构、枚举)。

     

    优缺点

    优点:

    • 1、反射提高了程序的灵活性和扩展性
    • 2、降低耦合性,提高自适应能力。
    • 3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。

    缺点:

    • 1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
    • 2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

    二、C# 反射的使用场景

    • 它允许在运行时查看特性(attribute)信息。
    • 它允许审查集合中的各种类型,以及实例化这些类型。
    • 它允许延迟绑定的方法和属性(property)。
    • 它允许在运行时创建新类型,然后使用这些类型执行一些任务。

    三、C# 反射获取类型方式

    1.类型:Type

    1. 1    
    2. //通过Typeof获取某个值的类型
    3. System.Type type = typeof(PeopleInfo);
    4. 2    
    5. //通过GetType获取对象类型
    6. PeopleInfo peopleInfo = new PeopleInfo();
    7. peopleInfo.Age = 23;
    8. System.Type type1 = peopleInfo.GetType();
    9. System.Type type2 = peopleInfo.Age.GetType();
    10.         
    11. 3    
    12. //通过GetType获取类名称类型
    13. System.Type type = System.Type.GetType("Test_Reflection.PeopleInfo");

    2.成员:MethodInfo ,方法,字段,属性

    成员字段:FieldInfo 

    成员属性:PropertyInfo

    3.实例化:Activator 获取反射类型的三种方式
    序号    获取反射类型的三种方式

    Activator反射不同的构造进行实例化对象

    1. 序号    Activator方法    说明
    2. 1    CreateInstance(Type t)    使用默认Public修饰的无参数构造实例化对象
    3. 2    CreateInstance(Type,bool nonPublic)    使用Private修饰的无参构造实例化对象
    4. 3    CreateInstance(Type type, params object?[]? args)    使用Public修饰的有参构造实例化对象
    5. 4    CreateInstance(Type type, object?[]? args, object?[]? activationAttributes)    使用Public修饰的有参构造和公有属性实例化对象
    6. 5    CreateInstance(Type type, BindingFlags bindingAttr, Binder? binder, object?[]? args, CultureInfo? culture)    使用指定的BindingFlags组合,可选有无参数构造实例化对象

    使用的命名空间
    使用反射需要引用命名空间【using System.reflection】,这个命名空间包含如下的类:

    System.Reflection命名空间包含的主要类
     

    1. 序号    System.Reflection命名空间包含的主要类(反射涉及到的类)
    2. 1    System.Reflection.Assembly 
    3. 2    System.Reflection.MemberInfo
    4. 3    System.Reflection.EventInfo
    5. 4    System.Reflection.FieldInfo
    6. 5    System.Reflection.MethodBase
    7. 6    System.Reflection.ConstructorInfo
    8. 7    System.Reflection.MethodInfo
    9. 8    System.Reflection.PropertyInfo
    10. 9    System.Type   

    更多:

    C# 合并对象_C# 对象合并整理

    EfCore 表关系一对一,使用案例

    C# IO Stream 流(二)扩展类_封装器

  • 相关阅读:
    基于C# wimfom框架的图书管理系统开题报告
    Linux运维常用小总结
    stm32f4dma串口收数卡死
    linux操作系统期末考试题库
    linux 网络设计 ip命令
    知识图谱增强的KG-RAG框架
    Codeforces Round #816 (Div. 2)
    网络优化(五)——正则化
    使用html+css+js实现一个静态页面(含源码)
    获取请求IP以及IP解析成省份
  • 原文地址:https://blog.csdn.net/u011127019/article/details/128163498