2

假设我有一个类似这样的工厂:

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 具有这种构造函数。

我知道我可以用这样的方式替换对 new T 的调用:

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

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

4

2 回答 2

2

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

编译时,无法识别 ctor 的参数(如果它不是常量)。

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

于 2012-07-18T07:16:39.310 回答
0

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

于 2012-07-18T07:16:46.290 回答