我有一个名为" 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在运行时构建并编译一个类型/类,并将它与参数的类/类型进行比较。
问题是:有没有更好的方法来做我想做的事情? 并提出一个建议:为什么要打扰类型检查呢?只需在现场级别进行比较。我认为这会使运行时引擎更加灵活。
感谢任何帮助 克里斯
答案 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
会更有用。