博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射的具体应用
阅读量:6678 次
发布时间:2019-06-25

本文共 2831 字,大约阅读时间需要 9 分钟。

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    {        ///         /// 数据键值        ///         public string ID { get; set; }        ///         /// 配置分类        ///         public string Category { get; set; }        ///         /// 机台名称        ///         public string EquipmentName { get; set; }        ///         /// 机台部位        ///         public string EquipmentPart { get; set; }        ///         /// 名称        ///         public string Name { get; set; }        ///         /// 值        ///         public string Value { get; set; }    }

 

 

 获取配置项的数据后,使用反射机制将配置项的值设置到系统配置实体类的对应属性上,实际上,此处的默认约定就是,系统配置项的名称必须和上位机系统配置类的属性名称相同,否则会无法执行反射操作。

public partial class SystemConfig{        ///         /// 设置远程配置        ///         private void SetRemoteConfig(List
itemList) { var propertyInfoArray = this.GetType().GetProperties(); List
propertyInfoList = new List
(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); } } }

 

转载于:https://www.cnblogs.com/DreamOfLife/p/8799043.html

你可能感兴趣的文章
FOSCommentBundle功能包:其它添加评论到页面的方法
查看>>
SQL Server 2012笔记分享-17:理解并设置文件表(FileTable)
查看>>
MongoDB运行状态、性能监控与分析
查看>>
Exchange 2016共享邮箱不保存已发送邮件的问题
查看>>
[C#基础知识系列]全面解析C#中静态与非静态
查看>>
SQL Server 2012笔记分享-40:自动维护索引
查看>>
C/C++各种系统开发环境搭建
查看>>
dwz navtab 限制打开数量实例
查看>>
Linq技术四:动态Linq技术 -- Linq.Expressions
查看>>
ARC __bridge modifiers demystified
查看>>
[转]HTML字符实体(Character Entities),转义字符串(Escape Sequence)
查看>>
【hoj】2651 pie 二分查找
查看>>
真正的干货是什么?
查看>>
LR函数基础(二)
查看>>
SharedPreference.Editor的apply和commit方法异同
查看>>
【Xamarin开发 Android 系列 6】 Android 结构基础(上)
查看>>
学习一样新东西行而有效的方法 学习捷径 一项由10个步骤组成的学习方法
查看>>
Spotlight实时监控Windows Server 2008
查看>>
linux shell “(())” 双括号运算符使用
查看>>
http://code.662p.com/view/5141.html
查看>>