为通用参数指定构造函数约束

时间:2010-08-04 17:21:24

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

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

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;
}

2 个答案:

答案 0 :(得分:13)

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

您最好的选择可能是定义一个可以使用的界面,并约束到界面。您可以使用“初始化”样式方法获取“A”对象,然后调用该对象,而不是尝试在构造时设置对象。

答案 1 :(得分:3)

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

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));