假设我有一家工厂装扮成这样:

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构造函数必须无参数的技术原因是什么?我觉得关于泛型我有些不了解。我已经看到与该主题相关的一些问题,但没有任何答案能真正启发我。

最佳答案

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

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

这就是为什么您必须拥有一个“空” ctor的原因,CLR才能包含您类型的对象。

关于c# - C#中的工厂,构造函数和泛型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11536017/

10-15 17:57