2017-10-13 12 views
1

固定長レコード形式のレポートがいくつかあります。 FileHelpersを使用して区切られたレコード形式に変換しています。genericをパラメータ化できますか?

あり、我々は固定と区切られたモデルを説明する考えのserveralの報告があり、私は新たなんだ、それDRY私たちが行うことができます何か

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

ようにすると

FileTransformEngine<TSource, TDestination>(); 

に渡すとC#とジェネリックスと私はどこから始めるか分からない。

これは可能かどうかは誰にでも分かりますが、すべてのモデルが既に作成されているのでコンパイル時に利用できると思います。両方のための独自の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);  

    } 
} 

これが機能するためには、あなたのクラスが必要になります属性の両方への呼び出しをラップするために、かなり簡単なはずですので -

+0

で呼び出されます。正確に後であなたはどのような "ガイダンス"ですか? – Jamiec

+0

Reflectionを使わずに達成できるかどうか? – kiranm516

答えて

2

はfilehelpersのドキュメントには、どのようにread a fixed filewrite a delimited file示し読み書き。例えば

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

次に、あなたが入力と出力のためのさまざまな種類をしたい場合は、クラスが1を変換するための述語と一緒に2種類(入力および出力)を取るかもしれない

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

    } 
} 

これは、あなたの質問は不明であるあなたの2種類

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

助けてくれてありがとう。私はあなたの例でそれを完了することができます。 – kiranm516

関連する問題