【问题标题】:Specifying constructor constraint for Generic Parameter [duplicate]为通用参数指定构造函数约束
【发布时间】:2010-08-04 17:21:23
【问题描述】:

我有一组对象,我将它们作为参数传递以创建另一种类型的对象(一对一)。我在很多地方都这样做(基本上从数据对象转换为业务对象)。我想写一个通用的扩展方法来完成这个。但是我被卡住了,因为我不知道如何指定业务对象具有以数据对象作为参数的构造函数的约束。以下是我的函数代码:

public static IList<T> ConvertTo<A,T>(this IEnumerable<A> list) 
                    where T : new(A)/*THIS IS PROBLEM PART*/
{
    var ret = new List<T>();

    foreach (var item in list)
    {
        ret.Add(new T(item));
    }
    return ret;
}

【问题讨论】:

    标签: c# generics extension-methods type-constraints


    【解决方案1】:

    不幸的是,这在 C# 中是不允许的。您可以有一个 new() 约束,强制该类型具有默认构造函数,但这是 .NET 支持的唯一与构造函数相关的约束。

    您最好的选择可能是定义一个您可以使用的接口,并限制该接口。您可以使用“Initialize”样式的方法来获取“A”对象并调用它,而不是尝试在构造时设置对象。

    【讨论】:

    • 是的,界面方式很好,我可以使用它,因为我使用T4模板生成BO,所以不会太多工作。
    【解决方案2】:

    您不能以这种方式约束泛型类型构造函数(仅需要无参数构造函数),但您可以使用委托来进行构造:

    public static IList<T> ConvertTo<A, T>(this IEnumerable<A> list, Func<A, T> constructionFunc)
    {
        return list.Select(constructionFunc).ToList();
    }
    

    并像这样使用它:

    var IList<T> converted = someSequence.ConvertTo(a => new T(a));
    

    【讨论】:

    • 函数参数的任何例子?我应该在 T 类的哪里定义它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多