使用FixedLengthClassBuilder写入String

时间:2014-06-01 10:44:32

标签: c# filehelpers

我有一个名为" SepaRecord"的c#类,已在dll中定义,我无法修改。 我在运行时有一个List,我需要将其转换为固定长度的文件。

我尝试的方法是,使用FixedLengthClassBuilder创建记录的运行时定义,如下所示:

FixedLengthClassBuilder fileRecordBuilder = new FixedLengthClassBuilder("SepaRecord");
fileRecordBuilder.AddField("RecordCode", 2, typeof(string));
fileRecordBuilder.AddField("CurrencyCode", 3, typeof(string));
fileRecordBuilder.AddField("CreditAmount", 15, typeof(int));
// other fields follow....

RecordCode,CurrencyCode,CreditAmount等是定义了" SepaRecord" DLL中的类。

我希望如果我将列表传递给FileHelperEngine,我会找回一个分隔的字符串:

List<SepaRecord> lst = this.goGetMyList();
string ret = this.FileHelperEngine.WriteString(lst);

但是当然它不起作用,因为FixedLengthClassBuilder在运行时构建并编译一个类型/类,并将它与参数的类/类型进行比较。

问题是:有没有更好的方法来做我想做的事情? 并提出一个建议:为什么要打扰类型检查呢?只需在现场级别进行比较。我认为这会使运行时引擎更加灵活。

感谢任何帮助 克里斯

1 个答案:

答案 0 :(得分:0)

FileHelpers不提供其他类的字段的自动映射。其他库(如AutoMapper)可以更好地处理该功能。

FileHelpers是一个用于描述文本文件的库。 FixedLengthClassBuiler正在创建文本输出的规范。

您需要将List<SepaRecord>的内容映射到IEnumerable<T>,其中T是由

创建的类型
Type recordClass = fileRecordBuilder.CreateRecordClass();
var recordClassLst = lst.Select(sepaRecord => ConvertToRecordClass(sepaRecord));    
string ret = this.FileHelperEngine.WriteString(recordClassLst);

如果您愿意,您需要通过AutoMapper自行编写ConvertToRecordClass功能代码。

附加说明:您可能会发现更容易为文本文件规范创建具体类,而不是使用FixedLengthClassBuilder

[FixedLengthRecord(",")]
public class MyClass
{
    [FixedLengthRecord(2)]
    public string RecordCode;
    [FixedLengthRecord(3)]
    public string CurrencyCode;
    [FixedLengthRecord(15)]
    public int CreditAmount;
    // etc.
}

然后更容易创建IEnumerable<MyClass>。 (如果直到运行时才知道类记录定义,FixedLengthClassBuiler会更有用。