如何通过foreach从MemMainS类列表中获取sValues结构体值以备份PLC数据?
如何通过foreach循环从List中获取结构体数据?
首先得补上一个关键细节:你目前的TestList还是空的——SetTest方法只是给mainCurrent实例完成了赋值,但没有把这个实例添加到列表里。先解决这个问题,再用foreach循环遍历就很顺畅了。
1. 完善测试数据赋值逻辑,将实例加入列表
修改你的SetTest方法,在赋值完成后把mainCurrent添加到TestList中;如果需要多个测试实例,也可以创建新的MemMainS对象重复这个流程:
private void SetTest() { // 给第一个实例赋值 mainCurrent.svMode.ObjectName = "Obj1.Addr1"; mainCurrent.svMode.Value = 1; mainCurrent.svFreqOrBal.ObjectName = "Obj2.Addr2"; mainCurrent.svFreqOrBal.Value = 2; // 将赋值后的实例添加到列表 TestList.Add(mainCurrent); // 可选:添加第二个测试实例 var secondInstance = new MemMainS(); secondInstance.svMode.ObjectName = "Obj3.Addr3"; secondInstance.svMode.Value = 3; secondInstance.svFreqOrBal.ObjectName = "Obj4.Addr4"; secondInstance.svFreqOrBal.Value = 4; TestList.Add(secondInstance); }
2. 使用foreach循环遍历列表获取数据
根据你的需求,有两种常用的遍历方式:
方式一:直接访问已知的sValues成员
如果MemMainS类中的sValues成员数量固定,且你明确知道每个成员的名称,直接逐个访问最直观:
// 遍历TestList中的每个MemMainS实例 foreach (var memItem in TestList) { // 获取svMode的名称和数值 Console.WriteLine($"svMode: 名称={memItem.svMode.ObjectName}, 数值={memItem.svMode.Value}"); // 获取svFreqOrBal的名称和数值 Console.WriteLine($"svFreqOrBal: 名称={memItem.svFreqOrBal.ObjectName}, 数值={memItem.svFreqOrBal.Value}"); // 如果有其他sValues类型的成员,按同样格式继续访问即可 }
方式二:用反射遍历所有sValues成员
如果MemMainS类中有大量sValues成员,不想逐个手动写访问代码,可以用反射自动遍历所有sValues类型的公共属性:
using System.Reflection; using System.Linq; // ... foreach (var memItem in TestList) { // 获取MemMainS类中所有类型为sValues的公共实例属性 var sValuesProperties = typeof(MemMainS) .GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(prop => prop.PropertyType == typeof(sValues)); foreach (var prop in sValuesProperties) { // 获取当前属性对应的sValues实例 var sv = (sValues)prop.GetValue(memItem); // 输出数据 Console.WriteLine($"{prop.Name}: 名称={sv.ObjectName}, 数值={sv.Value}"); } }
这样就能轻松遍历TestList中的所有数据,把每个sValues的名称和整数值提取出来做备份啦。
内容的提问来源于stack exchange,提问作者Stefan Kaim
相关产品推荐
相关产品推荐

