反射
反射
简介:
反射指程序可以访问、检测和修改它本身状态或行为的一种能力。
程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。
您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
优点
- 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,
},
]