7

私はこのような一般的なフラットファイルリーダーを構築しています。

 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; }
}
4

1 に答える 1

2

持っているジェネリック制約の型宣言の必要性を取り除く方法はありません。

ただし、ユースケースは、これが最も一般的な動作であることを示しています。

var reader = new GenericReader<Composite<Header, Data, Trailer>, 
    Header, Data, Trailer>();

この場合、特定のパターンが使用される頻度について推測できる場合は、より簡単に使用できるクローズド型定義を持つジェネリッククラスから型(または型のセット)を継承できます。

上記の場合、(一般的な定義に加えて)基本的な最も一般的なケースにこれらのクラスを提供できます。

public class Composite : GenericComposite<Header, Data, Trailer> { }

public class GenericReader : GenericReader<
    Composite, Header, Data, Trailer>
{ }

その場合、次のように使用されます。

var reader = new GenericReader();

var composite = reader.Read();

Console.WriteLine(composite.Data.SomeProperty);

Console.ReadLine();

高度に専門化されたケースに使用する汎用パラメーターを持つタイプは引き続きありますが、一般的なユースケース(分析/ドメイン知識を通じて決定)の場合、最も一般的なものを判別し、セットタイプのクラスを提供できます。支援するパラメータ。

于 2012-11-27T19:14:35.670 に答える