2017-10-13 3 views
1

고정 길이 레코드 형식의 보고서가 여러 개 있습니다. 우리는 구분 된 레코드 형식으로 변환하기 위해 FileHelpers를 사용하고 있습니다.제네릭 형식을 매개 변수화 할 수 있습니까?

이 우리가 고정으로 구분 된 모델을 설명하는 생각 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

리플렉션을 사용하지 않고도이를 달성 할 수 있습니까? – 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; } 
} 

당신은

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

관련 문제