C#泛型中使用new()限制类型:(new(T))

6
我正在构建一个小助手,将EF4对象转换为POCOs。 (我知道有AutoMapper,但此时我有一个c#困境)
如何使其工作(where P: new(E)不合法)?我希望确保P(POCO)类有一个接受E类的构造函数(从而处理转换)。
我该如何解决这个问题?
我该如何在C#中创建一个可以使用new(type)约束的通用函数?
   public static List<P> ListConvert<E, P>(List<E> efList) where P: new(E)
    {
        List<P> pList = new List<P>();

        foreach (E item in efList)
        {
            P myItem = new P(item);
            pList.Add(myItem);
        }
        return pList;
3个回答

8

没有这种限制。您可以添加一个额外的参数:

public static List<P> ListConvert<E, P>(List<E> efList, Func<E, P> func)

这样就不需要成为构造函数,而是可以传递一个委托来调用构造函数:

ListConvert(list, x => new Foo(x))

我有一个蓝天想法,可以实现构造器约束,称为"静态接口" - 这些只对泛型约束有用,但也能实现一些操作符用例。


"静态接口" - 你应该在 F# 中尝试泛型。 - Tim Robinson

2

并不存在P : new(E)这样的语法,但是你可以让调用者提供一个委托,该委托知道如何根据E构造一个P

public static List<P> ListConvert<E, P>(List<E> efList, Func<E, P> converter)
{
    List<P> pList = new List<P>();

    foreach (E item in efList)
    {
        P myItem = converter(item);
        pList.Add(myItem);
    }
    return pList;
}

然而,如果你这样做,你可能会使用LINQ: efList.Select(e => new P(e)).ToList()


(注:此句为原文内容,无需翻译)

Where P: new(e) 有同样的问题...但我认为它与转换器无关。 - Dani

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接