C#中的工厂,构造函数和泛型

时间:2012-07-18 07:09:31

标签: c# generics constructor

假设我有一家工厂重新安排这个:

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和Serializer的公共访问器。

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

我知道我可以用以下内容替换我对新T的调用:

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

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

2 个答案:

答案 0 :(得分:2)

泛型是编译时工件。这意味着在编译时会有新生成的合适类。

编译时,ctor的参数尚未被识别(如果它不是常数)。

这就是为什么你必须有一个&#34;空的&#34; ctor,CLR能够同意您的类型对象。

答案 1 :(得分:0)

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