C#.NET 3.5获取一般定义
我有下面的类C#.NET 3.5获取一般定义
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()时,它应该根据类顶部定义的泛型类型创建一个实习实例。
你有什么应该差不多的工作,除非你不t要求你的泛型参数是可实例化的。如果添加的是作为一个约束,你应该能够使用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>();
}
}
第一个将编译成第一个 –
@ViacheslavSmityukh这是编译器的存在。 1 2我认为更好;-) –
您可以创建IJob工厂来实现它
interface IJobFactory
{
IJob Create();
}
class FullTimeJobFactory
: IJobFactory
{
IJob Create()
{
return new FullTimeJob();
}
}
class InternshipJobFactory
: IJobFactory
{
IJob Create()
{
return new InternshipJob();
}
}
现在你可以使用抽象factoy IJobFactory创建抽象IJob的instancies
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())
{}
}
我想我不清楚我的问题。我想要的是在FullTimeJobDao内部调用buildJob()时创建FullTimeJob的实例。当从InternshipDao内部调用buildJob()时,它应该根据类顶部定义的泛型类型创建一个实习实例。 –
'default(T)'只是'null'。 – hvd
是的,那不会做我想做的事,我不认为。我希望我上面的编辑更清晰。 –
你必须声明你AbstractJobDao
类是这样的:
public class AbstractJobDao<T> where T : IJob, new() {
protected T buildJob() {
return new T();
}
}
注意new()
后IJob
:这样一来,就表示参数T
:
- 器具
IJob
的方法 - 信息不带参数的构造函数。
所以编译器会允许你使用new T()
。
Type.GenericTypeArguments + Activator.CreateInstance() –
上面的voroninp的评论是我在这里寻找的答案。谢谢! –