[英]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
:
IJob
的方法 因此,编译器将允许您使用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.