c#泛型new()约束类型:(new(T))

时间:2011-01-13 17:12:03

标签: c#-4.0 generics

我正在构建一个小帮手,将EF4对象转换为POCO。 (我知道有AutoMapper,但我现在有一个c#困境)

我如何才能使这项工作(,其中P:new(E)不合法 我希望确保P(POCO)类作为接受E类的构造函数 (因此处理转型)

我该如何做到这一点?

如何在C#中创建一个可以采用新(类型)约束的泛型函数?

   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 个答案:

答案 0 :(得分:8)

没有这样的限制。你可以做的是有一个额外的参数:

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

这样就不需要构造函数了,但是你可以传入一个调用构造函数的委托:

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

我有一个蓝天的想法可以启用构造函数约束,称为"static interfaces" - 这些只对通用约束有用,但也会启用一些操作符用例。

答案 1 :(得分:2)

这是不可能的。 new约束仅允许您通过public parameterless constructor创建对象。

答案 2 :(得分:2)

没有P : new(E)这样的东西,但你可以让调用者提供一个知道如何构建P给定E的委托:

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