反射的具体应用

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);
            }
        } 
}

 

以上是关于反射的具体应用的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL片段着色器不照亮场景

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

反射的具体应用

反射基础

长篇图解java反射机制及其应用场景

反射机制-动态代理