2012-01-03 6 views
2

私はこのような一般的なクラスを持っている:ジェネリッククラスはパラメータを持つTコンストラクタを強制的に使用できますか?

public class Mapper<TEntity, TDataAccess> 
    where TEntity : Common.IEntity 
    where TDataAccess : DataAccess, new() 
{ 
    public TDataAccess DataAccess { get; set; } 
    public Mapper() 
    { 
     DataAccess = new TDataAccess(); 
    } 
    /* 
    * ... 
    * */ 
} 

およびデータアクセスは、このようなものです:

public class DataAccess 
{ 
    public DataAccess() 
    {} 

    public DataAccess(string tranName) 
    {} 

    // CRUD functionality and other data access staff 
} 

と継承されたクラスフォームDataAccess

public class UserDataAccess:DataAccess 
{ 
    public UserDataAccess():base(string.Empty) 
    { 
    } 
    public UserDataAccess(string tranName):base(tranName) 
    { 
     // Something to do with user 
    } 
} 

し、最終的にUserMapperマッパーから:

public class UserMapper : Mapper<User,UserDataAccess> 
{ 
    // Mapping entity properties with datarows columns 
} 

tranNameTDataAccessUserMapperに送信する必要があると想像してください。どのようにDataAccessクラスを変更せずにこれを行うことができますか?私はDataAccessのソースにアクセスすることはできませんし、ジェネリックスは型の異なるコンストラクタのオーバーロードを認識しません。 私はUserDataAccessにプロパティを持つことができ、必要なときにいつでも入力できることを知っていますが、スレッドの安全性の問題のためにできません。

Userクラスは単純なエンティティで、プロパティのみを持ちます。

答えて

2

Genericsではこれをサポートしていません。オプション:

  • は、デフォルトによってnew TDataAccess()使用していますが、それはどのようにでもオブジェクトを作成するために、UserMapperで上書きすることができていること、protected virtual TDataAccess CreateDataAccess()方法を持っています。デリゲートとしてファクトリメソッドにCreateDataAccess()代わりにnew TDataAccess()
  • パス、すなわちFunc<TDataAccess>呼び出す - ので、呼び出し側は() => new DataAccess("foo")を供給し、その代わりnew TDataAccess()
  • 使用TDataAccessを作成するために、反射ベースのコードのことを使用することができる - のいずれかActivator.CreateInstance (これは、パラメータをサポートしています)、または何かがあなたがコンストラクタのパラメータを指定することでActivator.CreateInstance()メソッドのオーバーロードを使用することができる場合として、メタプログラミング(ExpressionILGenerator、など)
+0

Activator.CreateInstanceが機能します。ありがとう;) – MDP

3

を含む:

var dataAccess = Activator.CreateInstance(
          typeof(TDataAccess), 
          new object[] { tranName }); 

public static Object CreateInstance(
    Type type, 
    params Object[] args 
) 

は 最高の指定したパラメータに一致するコンストラクタを使用して、指定された型のインスタンスを作成します。

+0

ありがとうsll、それは考えている;) – MDP

+0

喜んで、あなたは歓迎です – sll

関連する問題