我可以参数化通用类型吗
Can I parameterize generic Type
我们有几份固定长度记录格式的报告。我们正在使用 FileHelpers 将它们转换为分隔记录格式。
由于有一些报告,我们想到了描述固定和分隔模型并传递给
FileTransformEngine<TSource, TDestination>();
至于让它变干,我们可以做类似
的事情吗
Transform<TInput, TOutput>()
{
var engine = new FileTransformEngine<TInput, TOutput>();
engine.TransformFileFast(...);
}
我是 C# 和泛型的新手,我不确定从哪里开始。
任何人都可以给我一些指导,这是否可能,因为所有模型都已经创建,我认为它们在编译时可用。
filehelpers 的文档展示了如何 read a fixed file and 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);
}
}
为此,您的 class 需要读写属性。例如
[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");
如果您想要不同的输入和输出类型,您可以让 class 采用两种类型(输入和输出)以及用于将一种类型转换为另一种类型的谓词。
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();
});
我们有几份固定长度记录格式的报告。我们正在使用 FileHelpers 将它们转换为分隔记录格式。
由于有一些报告,我们想到了描述固定和分隔模型并传递给
FileTransformEngine<TSource, TDestination>();
至于让它变干,我们可以做类似
的事情吗Transform<TInput, TOutput>()
{
var engine = new FileTransformEngine<TInput, TOutput>();
engine.TransformFileFast(...);
}
我是 C# 和泛型的新手,我不确定从哪里开始。
任何人都可以给我一些指导,这是否可能,因为所有模型都已经创建,我认为它们在编译时可用。
filehelpers 的文档展示了如何 read a fixed file and 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);
}
}
为此,您的 class 需要读写属性。例如
[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");
如果您想要不同的输入和输出类型,您可以让 class 采用两种类型(输入和输出)以及用于将一种类型转换为另一种类型的谓词。
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();
});