反射的具体应用
Posted 生命梦想
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射的具体应用相关的知识,希望对你有一定的参考价值。
1.业务场景
随着车间中上位机数目的增加,系统运维人员的工作量也在增加,有时候修改一些配置信息,可能需要运维人员挨个在上位机系统中进行修改,因此,把一些配置信息的修改调整到后台系统中,上位机在交接班和系统重启或者上位机启动后台线程每个一段时间查询一次,获取到对应的配置信息,然后进行修改,这样操作的话,能够极大地减轻运维人员的工作量。
2.后台程序设计
首先,创建配置类别表,用来描述配置项的类别信息,比如,打印配置、系统开关配置、扫描条码长度配置等。
系统配置类别表:Configure_Class | ||
ID(PK) | 数据主键 | |
Name | 类别名称 | |
Description | 类别描述 | |
Category | 分类属性(Public、Private) |
Public:所有上位机公用 Private:上位机专属配置 |
Delete_Flag | 删除标记 | 用于数据的逻辑删除 |
然后,创建配置项表,用于描述配置项的详细信息。
系统配置项表Configure_Item | ||
ID(PK) | 数据主键 | |
Class_ID | 配置类别ID | |
Name | 名称 | |
Description | 描述 | |
Date_Type | 数据类型 | String、Boolean、SerialPort、Class等 |
Instruction | 配置项说明 | 配置项的详细说明 |
Delete_Flag | 删除标记 | 用于数据的逻辑删除 |
最后,创建系统配置表,用于描述上位机的详细配置信息。
系统配置表Configure | ||
ID(PK) | 数据主键 | |
Site_Name | 部门名称 | 名称也为其唯一标识信息 |
Area_Name | 区域名称 | |
PLine_Name | 生产线名称 | |
Equipment_Name | 机台名称 | |
Equipment_Part | 机台部位 | 较大的设备会使用两个上位机控制,分为不同的部位 |
Item_ID | 配置项ID | |
Item_Value | 配置项值 | 特殊的信息使用Json字符串标识,上位机进行解析 |
Delete_Flag | 删除标记 | 用于数据的逻辑删除 |
完成以上数据表的创建后,后台系统需要根据表结构进行编程实现,最后系统配置表中数据规则为
ID | Site_Name | Area_Name | PLine_Name | Equipment_Name | Equipment_Part | Item_ID | Item_Value | Delete_Flag |
1 | AAA | BBB | CCC | DDD | UP | 1 | 1(boolean类型) | |
2 | AAA | BBB | CCC | DDD | DOWN | 2 | 1(string类型) |
3.上位机程序设计
上位机程序在特定条件下触发获取后台系统配置的操作,从数据库中获取到机台对应的系统配置,并转换为对应的实体类;
上位机系统配置实体类:
public class RemoteConfigItem { /// <summary> /// 数据键值 /// </summary> public string ID { get; set; } /// <summary> /// 配置分类 /// </summary> public string Category { get; set; } /// <summary> /// 机台名称 /// </summary> public string EquipmentName { get; set; } /// <summary> /// 机台部位 /// </summary> public string EquipmentPart { get; set; } /// <summary> /// 名称 /// </summary> public string Name { get; set; } /// <summary> /// 值 /// </summary> public string Value { get; set; } }
获取配置项的数据后,使用反射机制将配置项的值设置到系统配置实体类的对应属性上,实际上,此处的默认约定就是,系统配置项的名称必须和上位机系统配置类的属性名称相同,否则会无法执行反射操作。
public partial class SystemConfig { /// <summary> /// 设置远程配置 /// </summary> private void SetRemoteConfig(List<RemoteConfigItem> itemList) { var propertyInfoArray = this.GetType().GetProperties(); List<PropertyInfo> propertyInfoList = new List<PropertyInfo>(propertyInfoArray); var publicItemList = itemList.FindAll(item => item.Category.Equals(ConfigCategoryConst.Public)); foreach (var configItem in publicItemList) { var propertyInfo = propertyInfoList.Find(item => item.Name.Equals(configItem.Name)); if (propertyInfo== null) { continue; } if (!propertyInfo.CanWrite) { continue; } //后期此处需要优化,需要对不是基元类型的属性,需要使用Json序列化方法,比如Json字符串序列化为对应的类实例 propertyInfo.SetValue(this, Convert.ChangeType(configItem.Value, propertyInfo.PropertyType), null); } } }
以上是关于反射的具体应用的主要内容,如果未能解决你的问题,请参考以下文章