2009-09-16 143 views
7

我试图构建一个使用的C#泛型功能的工厂方法。C#泛型 - 约束的类型参数

在此工厂方法我想将其约束到一些特定的类,所有这些没有一个默认的构造函数。

这里是我的榜样。有人能告诉我是否可以运行它吗?

public class AbstractClass { 
    //this abstract class does not have a default constructor, nor its subclasses 
    public AbstractClass(SomeClassName obj) { 
     //use obj for initialization 
    } 
} 

//this factory class should create objects of type T that inherit 
//from AbstractClass and invoke the non-default constructor 
public class FactoryClass { 
    public static T BuildObject<T> (SomeClassName obj) where T: AbstractClass { 
     return new T(obj); //does not work?!?!?! 
    } 
} 


//Edit: ANSWER!!! 
public static T BuildObject<T>(SomeClassUsedForTheConstructor item) where T : SomeAbstractClass { 
return (T) Activator.CreateInstance(typeof (T), item); 
} 

回答

4

看那Type类和GetConstructor。获得ConstructorInfo对象后,使用Invoke方法。

var x = typeof(T); 
var t = x.GetConstructor(new[] {obj.GetType()}); 
object u = t.Invoke(<inputs>); 
+0

这是我以前使用的,但现在我使用Brian提到的Activator.CreateInstance。 – 2009-09-16 18:59:53

3

不,您正在尝试使用的内置通用约束条件是不可能的。 新的关键字仅允许您将泛型类型约束为具有默认构造函数。

+0

并且只有在T:new()被定义的情况下。 – 2009-09-16 18:44:29

4

我不认为你可以实例化泛型类型,而a default constructor的约束类型。

请考虑,而不是指定的接口IAbstractClass,这样,你的工厂类可以设置SomeClassName参数作为IAbstractClass的属性。

此外,如果需要初始化一个抽象类的实例SomeClassName,想想也有一个空的默认构造函数,但在IAbstractClass定义丰富的初始化方法。例如:

public interface IAbstractClass { void Initialize(SomeClassName obj); } 

这样一来,你的静态BuildObject方法,而不是做:

public static T BuildObject<T>(SomeClassName obj) where T: AbstractClass 
{ 
    T newObject = new T(); 
    IAbstractClass ac = newObject as IAbstractClass; 
    ac.Initialize(obj); 
} 
5

我喜欢在仿制药需要创建类型T的新对象它的作品真的很好用Activator.CreateInstance(typeof(T))

+0

这应该进入.net岩石播客!感谢你的回答。 – Pablo 2009-09-16 19:23:34

+0

//最终代码 public static T BuildObject (SomeClassUsedForTheConstructor item)其中T:SomeAbstractClass { return(T)Activator.CreateInstance(typeof(T),item); } – Pablo 2009-09-16 19:25:05

+2

这很慢,没有编译时检查... – 2009-09-16 19:39:47