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() 方法中的代码行应该是什么样的?

编辑——我想我不清楚我的问题。我想要的是在 FullTimeJobDao 内部调用 buildJob() 来创建 FullTimeJob 的实例。当从 InternshipDao 内部调用 buildJob() 时,它应该根据类顶部定义的泛型类型创建一个 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()after 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 回答