C#.NET 3.5获取一般定义

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()时,它应该根据类顶部定义的泛型类型创建一个实习实例。

+1

Type.GenericTypeArguments + Activator.CreateInstance() –

+0

上面的voroninp的评论是我在这里寻找的答案。谢谢! –

你有什么应该差不多的工作,除非你不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>(); 
    }  
} 
+0

第一个将编译成第一个 –

+0

@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()) 
    {} 

} 
+0

我想我不清楚我的问题。我想要的是在FullTimeJobDao内部调用buildJob()时创建FullTimeJob的实例。当从InternshipDao内部调用buildJob()时,它应该根据类顶部定义的泛型类型创建一个实习实例。 –

+0

'default(T)'只是'null'。 – hvd

+0

是的,那不会做我想做的事,我不认为。我希望我上面的编辑更清晰。 –

你必须声明你AbstractJobDao类是这样的:

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

注意new()IJob:这样一来,就表示参数T

  1. 器具IJob的方法
  2. 信息不带参数的构造函数。

所以编译器会允许你使用new T()