2012-07-18 42 views
2

比方说,我有一个工厂ressembling这样的:工厂,建设者和泛型在C#

public static class BusinessObjectFactory 
{ 
    public static T Create<T>(int objectId) where T : BusinessObject, new() 
    { 
     var dataSource = DataLayer.DataSources.Repository.Get<T>(); 
     var serializer = DataLayer.Serializers.Repository.Get<T>(); 

     var businessObject = new T {ObjectId = objectId, DataSource = dataSource, Serializer = serializer}; 

     return businessObject; 
    } 
} 

这个工程提供我对的ObjectId,DataSource和串行公众存取。

我宁愿在我的T型构造函数中指定这些参数,知道 T被约束为一个BusinessObject,而一个BusinessObject具有这种类型的 构造函数。

我知道我可以像这样的东西取代我的呼叫转接至新T:

var businessObject = (T) Activator.CreateInstance(typeof (T), objectId, dataSource, serializer); 

但是,什么是技术的原因,我的T构造函数必须是无参数的?我觉得有些东西我不懂泛型。我看到了几个与这个话题相关的问题,但没有真正启发我的答案。

+0

编译器无法验证(或强制)没有人编写派生自“BusinessObject”的类,但没有一个构造函数接受三个参数“ObjectId,DataSource,Serializer”。那么这个类可以用作上面的'T'。没有通用约束的语法来约束具有正确的三参数构造函数的类型。 – 2012-07-18 08:36:30

回答

2

仿制药是编译时文物。这意味着在编译时间会有新生成的合适类。

编译时间 ctor的参数,还不能确定(如果它不是一个常数)。

这就是为什么你必须有一个“空”的ctor,CLR能够构建你的类型的对象。

+0

谢谢。这是我正在寻找的解释。 – 2012-07-18 07:19:46

0

只有一个new()约束,指定有一个无参数的构造函数。没有办法指定该类型需要构造函数T(ObjectId, DataSource, Serializer)。不在泛型约束中,而不在接口或基类中。