我正在构建一个小帮手,将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;
答案 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()
。