0

私は次のクラスを持っています

public class AbstractJobDao<T> where T : IJob {
  protected T buildJob() {
    // create an IJob implementation instance based on the generic parameter        
  }      
}

public class FullTimeJobDao : AbstractJobDao<FullTimeJob> {      
}

public class InternshipDao : AbstractJobDao<Internship> {      
}

FullTimeJobInternshipの両方がIJobインターフェースを実装しています。buildJob()メソッドで、リフレクションを使用してDao実装クラスのジェネリックを推測し、そのタイプのインスタンスを作成できるようにしたいと思います。.NET 3.5でリフレクションを使用してこれを行う方法はありますか?

もしそうなら、buildJob()メソッドのコードの行はどのように見えるべきですか?

編集-私は私の質問がはっきりしていないと思います。私が欲しいのは、buildJob()がFullTimeJobDao内で呼び出され、FullTimeJobのインスタンスを作成するときです。buildJob()がInternshipDaoの内部から呼び出されると、クラスの最上位で定義されているジェネリック型に基づいて、Internshipのインスタンスを作成する必要があります。

4

3 に答える 3

4

一般的な引数をインスタンス化可能にする必要がないことを除いて、持っているものはほとんど機能するはずです。これを制約として追加すると、次を使用できるようになりますnew

public class AbstractJobDao<T> where T : IJob, new() {
  protected T buildJob() {
    return new T();
  }      
}

または、その制約が状況に適していない理由がある場合は、次を使用できますActivator.CreateInstance

public class AbstractJobDao<T> where T : IJob {
  protected T buildJob() {
    return Activator.CreateInstance<T>();
  }      
}
于 2012-12-02T18:00:04.303 に答える
2

AbstractJobDaoこの方法でクラスを宣言する必要があります:

public class AbstractJobDao<T> where T : IJob, new() {
  protected T buildJob() {
    return new T();
  }      
}

new()後:このように注意してくださいIJob、あなたはそのパラメータを示していますT

  1. IJobのメソッドを実装します
  2. 引数のないコンストラクターを提供します。

したがって、コンパイラはを使用できるようにしますnew T()

于 2012-12-02T18:00:25.470 に答える
0

IJobファクトリを作成して実装できます

interface IJobFactory
{
  IJob Create();
}

class FullTimeJobFactory
  : IJobFactory
{
  IJob Create()
  {
    return new FullTimeJob();
  }
}

class InternshipJobFactory
  : IJobFactory
{
  IJob Create()
  {
    return new InternshipJob();
  }
}

これで、抽象ファクトイIJobFactoryを使用して、抽象IJobのインスタンスを作成できます。

public class AbstractJobDao<T> where T : IJob {
  public AbstractJobDao(IJobFactory<T> factory)
  {
  }

  protected IJobFactory<T> Factory{get;set;}

  protected T buildJob() {
    return Factory.Create();
  }      
}

public class FullTimeJobDao : AbstractJobDao<FullTimeJob> {

  public FullTimeJobDao()
    : base(new FullTimeJobFactory())
  {}     
}

public class InternshipDao : AbstractJobDao<Internship> {
  public InternshipDao ()
    : base(new InternshipJobFactory())
  {}

}
于 2012-12-02T17:52:20.583 に答える