为通用参数指定构造函数约束
我有一组对象,我作为参数传递给另一种类型的对象(一对一)。 我在很多地方这样做(基本上是从数据对象转换为业务对象)。 我想写一个通用的扩展方法来完成这个。 但是我被卡住了,因为我不知道如何指定业务对象具有将数据对象作为参数的构造函数的约束。 以下是我的function代码:
public static IList ConvertTo(this IEnumerable list) where T : new(A)/*THIS IS PROBLEM PART*/ { var ret = new List(); foreach (var item in list) { ret.Add(new T(item)); } return ret; }
不幸的是,C#中不允许这样做。 您可以使用new()
约束来强制该类型具有默认构造函数,但这是.NET支持的唯一构造函数相关约束。
您最好的选择可能是定义一个可以使用的界面,并约束到界面。 您可以使用“初始化”样式方法来获取“A”对象,然后调用它,而不是尝试在构造时设置对象。
您不能以这种方式约束generics类型构造函数(仅需要无参数构造函数),但您可以使用委托来执行构造:
public static IList ConvertTo(this IEnumerable list, Func constructionFunc) { return list.Select(constructionFunc).ToList(); }
并像这样使用它:
var IList converted = someSequence.ConvertTo(a => new T(a));