2012-03-09 19 views
3
class Factory<Product> where Product : new() 
{ 
    public Factory() 
     : this(() => new Product()) 
    { 
    } 

    public Factory(System.Func<Product> build) 
    { 
     this.build = build; 
    } 

    public Product Build() 
    { 
     return build(); 
    } 

    private System.Func<Product> build; 
} 

Productに公開のデフォルトコンストラクタがある場合は、クライアントが(最初のコンストラクタを使用して)コンストラクタの作成方法を指定する必要がないようにしたいと思います。しかし、私はProductに(2番目のコンストラクタを介して)パブリックデフォルトコンストラクタがない状況を許可したいと思います。C# "条件付き"制約付きの汎用クラス?

Factory第1世代のコンストラクタの実装を許可するには一般的な制約が必要ですが、パブリックのデフォルトコンストラクタを使用しないクラスでは使用できません。

両方を許可する方法はありますか?

答えて

8
直接

ない、しかし、あなたは、汎用的な方法で非ジェネリックFactory工場(原文のまま)を使用方法の型パラメータに型制約を入れて、制約のないFactory<T>にデリゲートを供給することを使用することができますクラス。

static class Factory 
{ 
    public static Factory<T> FromConstructor<T>() where T : new() 
    { 
     return new Factory<T>(() => new T()); 
    } 
} 

class Factory<TProduct> 
{ 
    public Factory(Func<TProduct> build) 
    { 
     this.build = build; 
    } 

    public TProduct Build() 
    { 
     return build(); 
    } 

    private Func<TProduct> build; 
} 
関連する問題