2012-12-02 34 views
0

我有下面的類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的評論是我在這裏尋找的答案。謝謝! –

回答

4

你有什麼應該差不多的工作,除非你不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我認爲更好;-) –

0

您可以創建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

是的,那不會做我想做的事,我不認爲。我希望我上面的編輯更清晰。 –

2

你必須聲明你AbstractJobDao類是這樣的:

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

注意new()IJob:這樣一來,就表示參數T

  1. 器具IJob的方法
  2. 信息不帶參數的構造函數。

所以編譯器會允許你使用new T()