先描述下需求
我遇到的问题是这样的,我们的无线设备有8个模拟端口,每个端口都对应不同的数据,可以使温度,湿度,光照强度等,这个端口与数据的关系不是绑定的,在之前的解决方案中,每次新项目都要根据现场的情况修改代码,太麻烦了,刚好最近学到反射就决定用这个来解决问题。
首先我在配置文件中写出对应关系
<add key="ADC0" value="temp"/> <add key="ADC1" value="airhumi"/> <add key="ADC2" value="soiltemp"/> <add key="ADC3" value="soilhumi"/> <add key="ADC4" value="wenddir"/> <add key="ADC5" value="Tlightrue"/> <add key="ADC6" value="lighwt"/> <add key="ADC7" value="light"/>
每个key对应代码中数据类的属性 可以在这里修改配置。
case "ADC0": data.GetType().GetField(Config.ADC0).SetValue(data, GetValue(strs[i + 1])); break; case "ADC1": data.GetType().GetField(Config.ADC1).SetValue(data, GetValue(strs[i + 1])); break; case "ADC2": data.GetType().GetField(Config.ADC2).SetValue(data, GetValue(strs[i + 1])); break; case "ADC3": data.GetType().GetField(Config.ADC3).SetValue(data, GetValue(strs[i + 1])); break; case "ADC4": data.GetType().GetField(Config.ADC4).SetValue(data, GetValue(strs[i + 1])); break;
这一部分就是根据对应关系来给数据接收类赋值,这里面的Confgi类是静态读取配置文件的,通过
data.GetType().GetField()找到数据类中的属性,再通过SetValue给属性赋值,原来在这里的一些计算全部放到后面赋值完成的时候,最后算是比较完美的解决这个问题。 小结:这样写可能会带来一点点效率上损失,但是可以极大的提高代码的复用性,就算以后端口变多了也只需要做很小的修改 实践才是学习最重要的一部分,看书和视频的时候对反射的概念一直很模糊,直到在实践中思考和实现的时候才基本理解了这部分的内容。
时间: 2024-10-17 06:27:41