zoukankan      html  css  js  c++  java
  • 反射的具体应用

    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);
                }
            } 
    }
  • 相关阅读:
    python实战===教你用微信每天给女朋友说晚安
    [go]beego获取参数/返回参数
    [go]os.Open方法源码
    [go]从os.Stdin探究文件类源码
    [svc]linux中的文件描述符(file descriptor)和文件
    [net]tcp和udp&socket
    [django]update_or_create使用场景
    [sh]shell语法小结
    [drf]访问文档出现错误'AutoSchema' object has no attribute 'get_link'
    [py]python操作zookeeper
  • 原文地址:https://www.cnblogs.com/DreamOfLife/p/8799043.html
Copyright © 2011-2022 走看看