我有一个包含大量属性的类,例如:
class MyStudent {
public string NAME;
public string TUTOR;
public int AGE;
// ... 100+ items
}
从固定宽度的文本文件中读取数据:
Matt John 20
JonathonBob 22
数据文件在单独的外部参照文件中定义:
NAME 8
TUTOR 8
AGE 2
我想从每行数据填充我的类,然后将其添加到此类型的列表中。这是我正在使用的方法,是否可以提高效率(不更改输入数据文件)?
首先,我已将外部参照文件读入列表,因此我可以使用LINQ访问WIDTH字段。
/* Read File */
List<MyStudent> signal_file = new List<MyStudent>();
while ((_dba_line = _dba_file.ReadLine()) != null)
{
if (!_dba_line.Substring(0, 2).Equals("--")) // Not a comment
{
MyStudent temp_signal = new MyStudent();
int _offset = 0;
int _width = 0;
_width = xref_file.First(item => item.DBU_FIELD == "NAME").WIDTH;
temp_signal.NAME = _dba_line.Substring(_offset, _width).Trim();
_offset += _width;
_width = xref_file.First(item => item.DBU_FIELD == "TUTOR").WIDTH;
temp_signal.TUTOR = _dba_line.Substring(_offset, _width).Trim();
_offset += _width;
// Continue for each property
// ...
// Finally
signal_file.Add(temp_signal);
}
}
我认为关键可能是外部参照DBU_FIELD始终等于类中的属性名称,并且其顺序与数据行匹配。如果可能的话,我想要达到的目标更接近:
foreach (XrefObject x in xref_file)
{
_width = x.WIDTH;
temp_signal.(x.DBU_FIELD) = _dba_line.Substring(_offset, _width).Trim();
_offset += _width;
}
// Finally
signal_file.Add(temp_signal);
如何使用外部参照对象DBU_FIELD值来访问我不确定的学生对象相关属性(如果可能的话)。
有关此用途的信息,这些文件在使用前已经过验证,因此可以保证它们正确匹配。
我愿意创建一个结构而不是一个对象,如果它更有意义,通常有500个实例,每个实例有大约100个混合字符串,int和float字段。
我也在寻找处理这种数据结构的最佳实践方法,而不仅仅是强迫它工作。
答案 0 :(得分:1)
您可以使用Reflection的GetProperty
和SetValue
方法
using System.Reflection;
foreach (XrefObject x in xref_file)
{
_width = x.WIDTH;
PropertyInfo prop =
temp_signal.GetType()
.GetProperty(x.DBU_FIELD, BindingFlags.Public | BindingFlags.Instance);
if(prop != null && prop.CanWrite)
{
prop.SetValue(temp_signal, _dba_line.Substring(_offset, _width).Trim(), null);
}
_offset += _width;
}