我可以参数化通用类型

时间:2017-10-13 08:43:02

标签: c# generics filehelpers

我们有几份固定长度记录格式的报告。我们正在使用FileHelpers将它们转换为分隔的记录格式。

由于有几个报告,我们考虑描述固定和分隔的模型并传递给

FileTransformEngine<TSource, TDestination>();

为了使它干,我们可以做类似的事情

Transform<TInput, TOutput>() 
{ 
var engine = new FileTransformEngine<TInput, TOutput>(); 
engine.TransformFileFast(...); 
} 

我是C#和泛型的新手,我不知道从哪里开始。

任何人都可以给我一些指导,这是否可行,因为所有模型都已创建,我认为它们在编译时可用。

1 个答案:

答案 0 :(得分:2)

文件管理器的文档显示了如何read a fixed filewrite a delimited file - 因此在您自己的FileTransformEngine

中包装调用应该非常容易
public class FileTransformEngine<T>
{
    public void TransformFileFast(string inputFile, string outputFile)
    {
       var readEngine = new FixedFileEngine<T>();
       T[] records = readEngine.ReadFile(inputFile);
       var writeEngine = new FileHelperEngine<T>();
       writeEngine.WriteFile(outputFile,records);       

    }
}

为此,您的课程需要阅读和写作的属性。例如

[FixedLengthRecord()]
[DelimitedRecord("|")]
public class MyRecord
{
     [FieldFixedLength(5)] // for reading
     [FieldConverter(ConverterKind.Decimal, ".")] // for writing
     public decimal Foo{get; set; }
}

然后你会用

var engine = new FileTransformEngine<MyRecord>();
engine.TransformFileFast("from/input.txt","to/output.csv");

如果你想要输入和输出的不同类型,你可以让类采用两种类型(一个输入和一个输出)以及一个用于将一个转换为另一个的谓词。

public class FileTransformEngine<TInput, TOutput>
{
    public void TransformFileFast(string inputFile, string outputFile, 
                                      Func<TInput,TOutput> transformer)
    {
       var readEngine = new FixedFileEngine<TInput>();
       TInput[] records = readEngine.ReadFile(inputFile);
       IEnumerable<TOutput> outputRecords = records.Select(transformer);
       var writeEngine = new FileHelperEngine<TOutput>();
       writeEngine.WriteFile(outputFile,outputRecords );       

    }
}

然后用你的两种类型调用

var engine = new FileTransformEngine<MyInputRecord, MyOutputRecord>();
engine.TransformFileFast("from/input.txt","to/output.csv", input => {
    //transform input to output.
    return new MyOutputRecord(); 
});