为通用参数指定构造函数约束
为通用参数指定构造函数约束
我有一个对象集合,我将其作为参数传递以创建另一种类型的对象(一对一)。我在许多地方都这样做(基本上是从数据对象转换为业务对象)。我想编写一个通用的扩展方法来实现这个目标。但是我遇到了困难,因为我不知道如何指定业务对象必须有一个以数据对象为参数的构造函数的约束条件。以下是我的函数代码:\n
public static IListConvertTo(this IEnumerable list) where T : new(A)/*这是问题的部分*/ { var ret = new List (); foreach (var item in list) { ret.Add(new T(item)); } return ret; }
问题的原因是无法在泛型类型参数中指定构造函数的约束(只能要求一个无参数的构造函数),但可以通过使用委托来进行构造:
解决方法是定义一个委托来进行构造,然后在泛型方法中使用这个委托:
public static IListConvertTo(this IEnumerable list, Func constructionFunc) { return list.Select(constructionFunc).ToList(); }
使用方法如下:
var converted = someSequence.ConvertTo(a => new T(a));
在这个例子中,`Func constructionFunc` 是一个函数参数,它接受类型为 `A` 的参数并返回类型为 `T` 的结果。在调用 `ConvertTo` 方法时,我们可以通过传递一个委托来指定如何进行构造。
关于 `constructionFunc` 的定义,应该在调用 `ConvertTo` 方法的地方进行定义,例如在类 `T` 中。