1

次のようなインターフェイスを実装する単純なファクトリクラスを作成したいと思います。

IFactory 
{
   TEntity CreateEmpty<TEntity>(); 
}

このメソッドでは、TEntity型(ジェネリック型)のインスタンスを返したいと思います。例:

TestClass test = new Factory().CreateEmpty<TestClass>(); 

出来ますか?インターフェースは正しいですか?

私はこのようなことを試しました:

private TEntity CreateEmpty<TEntity>() {
   var type = typeof(TEntity);
   if(type.Name =="TestClass") {
      return new TestClass();
   }
   else {
     ...
   }
}

しかし、それはコンパイルされません。

4

3 に答える 3

6

new()ジェネリック型パラメーターの制約を指定する必要があります

public TEntity CreateEmpty<TEntity>() 
    where TEntity : new()
{
    return new TEntity();
}

新しい制約は、使用される具象型にパブリックのデフォルトコンストラクター、つまりパラメーターのないコンストラクターが必要であることを指定します。

public TestClass
{
    public TestClass ()
    {
    }

    ...
}

コンストラクターをまったく指定しない場合、クラスにはデフォルトでパブリックのデフォルトコンストラクターがあります。

new()制約でパラメーターを宣言することはできません。パラメータを渡す必要がある場合は、適切なインターフェイスを定義するなどして、その目的専用のメソッドを宣言する必要があります。

public interface IInitializeWithInt
{
     void Initialize(int i);
}

public TestClass : IInitializeWithInt
{
     private int _i;

     public void Initialize(int i)
     {
         _i = i;
     }

     ...
}

あなたの工場で

public TEntity CreateEmpty<TEntity>() 
    where TEntity : IInitializeWithInt, new()
{
    TEntity obj = new TEntity();
    obj.Initialize(1);
    return obj;
}
于 2012-05-05T12:40:28.773 に答える
2
interface IFactory<TEntity> where T : new()
{
   TEntity CreateEmpty<TEntity>(); 
}
于 2012-05-05T12:41:10.313 に答える
2

このメソッドは、コンストラクターでパラメーターを次の順序で渡すのに役立ちます。

private T CreateInstance<T>(params object[] parameters)
{
    var type = typeof(T);

    return (T)Activator.CreateInstance(type, parameters);
}
于 2012-05-05T12:43:49.787 に答える