我可以参数化通用类型吗

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(); 
});