我可以参数化通用类型
问题描述:
我们有几种固定长度记录格式的报告。我们使用FileHelpers将它们转换为分隔记录格式。我可以参数化通用类型
由于有我们想象的描述固定和分隔的模型serveral的报告,并传递给
FileTransformEngine<TSource, TDestination>();
以使其DRY,我们可以做这样的事情
Transform<TInput, TOutput>()
{
var engine = new FileTransformEngine<TInput, TOutput>();
engine.TransformFileFast(...);
}
我是新来的C#和泛型,我不知道从哪里开始。
任何人都可以给我一些指导,不管这是否可能,因为所有的模型都已经创建了,我认为它们在编译时可用。
答
为filehelpers文档显示如何read a fixed file和write 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
你的问题还不清楚。你究竟在做什么“指导”? – Jamiec
这是否可以在不使用反射的情况下实现? – kiranm516