c# - C# 中的工厂、构造函数和泛型

标签 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 的公共(public)访问器,此方法就可以工作。

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

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

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

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

最佳答案

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

编译时,构造函数的参数还无法被识别(如果它不是常量)。

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

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

相关文章:

c++ - 构造函数调用了已创建的对象

c++ - 没有参数的 QDialog 显式构造函数 - 如何正确使用?

c# - 从 .NET Core 中的模型创建数据库表

c# - .NET 安装程序包安装程序

c# - Fleck - 从服务器发送数据

arrays - 在 Swift 中声明任何类型的数组时使用未声明的类型 'T'

c# - 是否可以有一个未知类型的数组?

generics - 如何在实现中继承泛型类型而在 Kotlin 中没有泛型接口(interface)?

java - 依赖注入(inject): templates (/generics) or virtual functions?

来自构造函数的 C++ 虚函数