繁体   English   中英

C#.NET 3.5获取通用定义

[英]C# .NET 3.5 Get Generic Definition

我有以下课程

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> {      
}

无论FullTimeJob实习实施IJob接口。 我希望buildJob()方法能够使用反射来推断Dao实现类中的泛型,然后创建该类型的实例。 有没有办法在.NET 3.5中使用反射来做到这一点?

如果是这样,在buildJob()方法中代码行应该是什么样?

编辑-我想我不清楚我的问题。 我想要的是在FullTimeJobDao内部调用buildJob()时创建FullTimeJob的实例的方法。 当从InternshipDao内部调用buildJob()时,它应根据类顶部定义的通用类型创建一个Internship实例。

您拥有的几乎可以正常工作,除非您不需要将通用参数实例化。 如果将其添加为约束,则应该可以使用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>();
  }      
}

您必须以这种方式声明AbstractJobDao类:

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

注意IJob之后的new() :这样,您就表明了参数T

  1. 实现IJob的方法
  2. 提供不带参数的构造函数。

因此,编译器将允许您使用new T()

您可以创建IJob工厂来实现它

interface IJobFactory
{
  IJob Create();
}

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

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

现在您可以使用抽象Factoy 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())
  {}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM