私はこのような一般的なフラットファイルリーダーを構築しています。
 public class GenericReader<TComposite, THeader, TData, TTrailer> 
    where TComposite : GenericComposite<THeader, TData, TTrailer>, new()
    where THeader : new()
    where TData : new()
    where TTrailer : new()
{
    public TComposite Read()
    {
        var composite = new TComposite();
        composite.Header = new THeader();
        composite.Data = new TData();
        composite.Trailer = new TTrailer();
        return composite;
    }        
}
そのように消費される可能性があります。
var reader = new GenericReader<Composite<Header, Data, Trailer>, Header, Data, Trailer> ();
var composite = reader.Read();
Console.WriteLine(composite.Data.SomeProperty);
Console.ReadLine();
使用されるクラスは次のとおりです。
public class Composite<THeader, TData, TTrailer> : GenericComposite<THeader, TData, TTrailer>
{
}
public class GenericComposite<THeader, TData, TTrailer>
{
    public THeader Header { get; set; }
    public TData Data { get; set; }
    public TTrailer Trailer { get; set; }
}
public class Header {
    public string SomeProperty { get { return "SomeProperty"; } } 
}
public class Data {
    public string SomeProperty { get { return "SomeProperty"; } } 
}
public class Trailer {
    public string SomeProperty { get { return "SomeProperty"; } } 
}
GenericReaderでそのジェネリック型情報を削除またはカプセル化する方法はありますか?私は私が欠けていたものを私に見せるために余分な目を探しています。私たちはすでにインターフェースを返し、消費者にキャストを行わせることで何かをしましたが、それは私の意見では責任を間違った場所に移すだけであり、それに加えてわずかなパフォーマンスのペナルティがあります。
ありがとう。
編集:TCompositeは必要ありません。GenericCompositeを返すだけです。どうすればそれを見逃すことができますか?
public class GenericReader<THeader, TData, TTrailer> 
    where THeader : new()
    where TData : new()
    where TTrailer : new()
{
    public GenericComposite<THeader, TData, TTrailer> Read()
    {
        var composite = new GenericComposite<THeader, TData, TTrailer>();
        composite.Header = new THeader();
        composite.Data = new TData();
        composite.Trailer = new TTrailer();
        return composite;
    }        
}
public class GenericComposite<THeader, TData, TTrailer>
{
    public THeader Header { get; set; }
    public TData Data { get; set; }
    public TTrailer Trailer { get; set; }
}