具有新类型约束的通用构造函数

时间:2016-06-01 13:44:23

标签: c# generics type-constraints

我有两种类型的对象,数据库模型和普通系统模型。

我希望能够将模型转换为数据库模型,反之亦然。

我写了以下方法:

 public static E FromModel<T, E>(T other) 
            where T : sysModel
            where E : dbModel
{
     return new E(other);
}

基本上sysModeldbModel都是抽象的。

dbModel有许多inherting类,它们都有拷贝构造函数。

我收到了:

  

无法创建类型参数的实例&#39; E&#39;因为它没有   有new()约束

我知道技术上有时我没有为T的每个值都有匹配的构造函数,至少调试器知道什么。

我也尝试添加where E : dbModel, new()约束,但它只是无关紧要。

有没有办法使用泛型方法和使用参数将模型转换为另一个模型?

感谢。

1 个答案:

答案 0 :(得分:4)

要在泛型类型上使用new,您必须在类/方法定义上指定new()约束:

public static E FromModel<T, E>(T other) 
        where T : sysModel
        where E : dbModel, new()

由于您在构造函数中使用了参数,因此无法使用new,但您可以使用Activator代替并传递other作为参数:

public static E FromModel<T, E>(T other)
    where T : sysModel
    where E : dbModel
{
    return (E)Activator.CreateInstance(typeof(E), new[]{other});
}