2017-10-13 48 views
1

我们有几种固定长度记录格式的报告。我们使用FileHelpers将它们转换为分隔记录格式。我可以参数化通用类型

由于有我们想象的描述固定和分隔的模型serveral的报告,并传递给

FileTransformEngine<TSource, TDestination>(); 

以使其DRY,我们可以做这样的事情

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

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

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

+0

你的问题还不清楚。你究竟在做什么“指导”? – Jamiec

+0

这是否可以在不使用反射的情况下实现? – kiranm516

回答

2

为filehelpers文档显示如何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(); 
}); 
+0

感谢您的帮助。我可以用你的例子完成它。 – kiranm516

相关问题