我正在使用FileHelpers C#库将文件读入将要处理的自定义对象数组。例如,部分文件定义:

[FixedLengthRecord]
public class Row
{
    [FieldFixedLength(9)]
    [FieldTrim(TrimMode.Right)]
    public string Ssn;

    [FieldFixedLength(15)]
    [FieldTrim(TrimMode.Right)]
    public string LastName;

    ...
}


在执行此操作时,我尝试遵守OOP原则,并且我注意到某些字段具有自然分组(例如SSNClientIDEmployerIDEmployerName等),因此我尝试将它们分成单独的类(例如ClientEmployer)。但这似乎是有问题的,因为某些字段需要在对象之间共享(例如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/

10-11 16:35