【发布时间】:2018-07-13 02:15:32
【问题描述】:
我正在尝试从 PLC 获取一些值(每个值都有一个名称和一个 int 值)并将它们保存在 PC 上作为备份。
所以我得到了名称和 int 的结构
public struct sValues
{
public string ObjectName;
public int Value;
}
由于我需要存储许多值,因此我还获得了一个包含所有这些值的类。
public class MemMainS
{
public sValues svMode;
public sValues svFreqOrBal;
(...)
}
还有一个班级列表
MemMainS mainCurrent = new MemMainS();
public List<MemMainS> TestList = new List<MemMainS>();
我也得到了一些测试值
private void SetTest()
{
mainCurrent.svMode.ObjectName = "Obj1.Addr1";
mainCurrent.svMode.Value = 1;
mainCurrent.svFreqOrBal.ObjectName = "Obj2.Addr2";
mainCurrent.svFreqOrBal.Value = 2;
}
当我尝试使用 foreach 从列表中获取数据时,只有当我告诉列表的确切元素时才有可能
foreach (var mv in TestList)
{
FieldInfo[] listFields = mv.GetType().GetFields(BindingFlags.Public
| BindingFlags.NonPublic
| BindingFlags.Instance);
int j = 0;
foreach (FieldInfo lf in listFields)
{
FieldInfo[] classFields = lf.FieldType.GetFields(BindingFlags.Public
| BindingFlags.NonPublic
| BindingFlags.Instance);
foreach(FieldInfo cf in classFields)
{
sValues sv;
//sv = TestList.ElementAt(j);//Possible to get it working like this?
sv = TestList.ElementAt(j).svMode;//Works for just svMode
//Output:
//Obj1.Addr1
//1
}
j++;
}
}
我是否错过了一些我还没有想到的东西?还是有可能?
如果我尝试 sv = TestList.ElemntAt(j); VS 编译器告诉我类型不一样,但类型是 sValues 和 sv 一样。
无法将类型“WinFormServer.Memory.MemMainS”隐式转换为 'WinFormServer.Memory.sValues'
【问题讨论】:
-
你为什么在这里使用
ElementAt根本?你可以直接去:TestList[j].svMode. -
您是否试图将
MemMainS类中sValues类型的命名属性视为一个集合? (即为什么需要反思) -
我认为您应该退后一步,专注于您的要求:创建值列表的备份(并可能从备份中重新加载数据)。根据细节,各种序列化技术和数据库可能是解决方案。
-
这段代码中有多个非常有问题的设计问题;我并不是说您不能 编写那样的代码,但所有这些公共字段和可变结构 迟早会咬你一口。这不是惯用的 C#。
-
但是问题被标记为 C# ... 你能用 C# 对你的 PLC 进行编程吗?如果不是,您的 C# 环境是什么?为什么它不能连接数据库?我怀疑您以某种方式将数据从 PLC 传输到“正常”环境中的单独 C# 程序,您可以在其中访问文件和数据库...