我正在使用FileHelpers C#库将文件读入将要处理的自定义对象数组。例如,部分文件定义:
[FixedLengthRecord]
public class Row
{
[FieldFixedLength(9)]
[FieldTrim(TrimMode.Right)]
public string Ssn;
[FieldFixedLength(15)]
[FieldTrim(TrimMode.Right)]
public string LastName;
...
}
在执行此操作时,我尝试遵守OOP原则,并且我注意到某些字段具有自然分组(例如
SSN
和ClientID
,EmployerID
和EmployerName
等),因此我尝试将它们分成单独的类(例如Client
和Employer
)。但这似乎是有问题的,因为某些字段需要在对象之间共享(例如ClientID
需要知道相关的EmployerID
)。为了使事情更复杂,我想在类定义中添加具有
[FieldNotInFile]
属性的字段,因为在处理过程中,我的应用程序将查询与特定行字段匹配的数据库记录,并填充该行的相应[FieldNotInFile]
(例如,基于数据库FName
从客户端获取SSN
,因为它不在文件中)。您将如何构成?我只是想将整个文件行作为一个类保留,但是它接近75个字段,这似乎很荒谬。有什么想法吗?
最佳答案
FileHelpers类只是使用C#语法定义平面文件规范的一种方法。
因此,FileHelpers类是C#类的一种特殊类型,您不应尝试使用公认的OOP原则。 (FileHelpers类有很多违反OOP原则的方式,最明显的是它要求您使用公共字段而不是属性)。 FileHelpers不应具有FileHelpers库所使用的属性或方法。
将FileHelpers类仅视为CSV格式的“规范”。那应该是它唯一的作用。然后,如果您需要在“正常”对象中记录,则将结果映射到更好的对象:
FileHelperEngine engine = new FileHelperEngine<FileHelpersOrder>();
var records = engine.ReadFile("FileIn.txt");
var niceOrders = records.Select(
x => new NiceOrder()
{ Number = x.Number,
Customer = x.Customer
// etc.
});
其中
FileHelpersOrder
是您的CSV规范,而NiceOrder
类将是具有属性,方法等的适当OOP类(根据需要)。关于c# - 用于在平面文件中对字段进行分组和结构化数据的设计模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26897273/