反射

反射

简介:

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

程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。

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

优点
  • 1、反射提高了程序的灵活性和扩展性。
  • 2、降低耦合性,提高自适应能力。
  • 3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
缺点
  • 1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
  • 2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。
使用背景

就拿我遇到的问题举例,在我们遇到前台高级查询需要绑定多个重复下拉框时,我们总不会一个一个的获取值赋值吧,毕竟那么多重复数据,只填数据都需要花费大量时间,和重复工作,这个时候,就可以用到我们的反射。

思路:首先我们可以获取要绑定的属性字段名称,和它相对应的自定义属性名称,在这里自定义属性名称是需要提前配置好,下面我会讲,然后有了这两个属性还不行,如果你涉及到有多种形式的控件,比如文本框、下拉框、日期框,那我们就需要把它的类型也获取到,具体实现看下面代码。
实体:
        /// <summary>
        /// 客户编号
        /// </summary>
        [DisplayName("客户编号")]
        [SugarColumn(IsPrimaryKey =true)]
        public string? Client_Id { get; set; }
        /// <summary>
        /// 客户名称
        /// </summary>
        [DisplayName("客户名称")]
        public string? Client_Name { get; set; }

在这里DisplayName可以给字段设置别名,也就是前台你需要显示的这个字段对应名称。

方法:   
        public IActionResult GetClictShow()
        {
             //实例化要获取的类
            List<StatsDto> list = new List<StatsDto>();
               
            //获取类的属性信息,返回ClientTable公共属性的 Type 对象数组
            var ster = typeof(ClientTable).GetProperties();

            //遍历属性信息
            foreach (var item in ster)
            {
                StatsDto rlist = new StatsDto();
    
                //获取字段属性名
                rlist.label = item.Name;

                //获取属性自定义别名
                rlist.values = item.GetCustomAttribute<DisplayNameAttribute>().DisplayName;
               
                //获取当前字段属性类型
                rlist.types = item.PropertyType.ToString().ToLower().Split(".")[1];

                list.Add(rlist);
            }   
            return Ok(list);
        }
 //输出结果:
[
  {
   label:Client_Id,
   value:客户编号,
   types:int32,
  },
  {
   label:Client_Name,
   value:客户名称,
   types:string,
  },
]
posted @ 2023-09-02 08:33  如果生活可以ctrl+z  阅读(46)  评论(0编辑  收藏  举报