是否有可能具有带参数构造函数约束的泛型方法?
本文关键字:约束 泛型方法 构造函数 参数 有可能 是否 | 更新日期: 2023-09-27 18:02:29
我有各种表示实体的类,例如:
public class Person
{
public int PersonID { get; set; }
public string PersonName { get; set; }
public bool IsSystemManager { get; set; }
public bool IsSystemAdmin { get; set; }
public Person() { }
public Person(DataRow row)
{
PersonID = (int)row["person_id"];
PersonName = row["person_name"] as string;
IsSystemManager = (bool)row["is_manager"];
IsSystemAdmin = (bool)row["is_admin"];
}
}
我想对DataTable
进行扩展,将其转换为类对象的列表,如下所示:
public static List<T> ToObjectList<T>(this DataTable table) where T : new(DataRow dr) //this is a compilation error
{
List<T> lst = new List<T>();
foreach (DataRow row in table.Rows)
lst.Add(new T(row));
return lst;
}
但是我不能有以DataRow
为参数的构造函数的约束。
有任何方法可以有这样的扩展方法吗?
不行,你不能要求构造函数带参数。这里你能做的最好的事情就是要求一个lambda:
public static List<T> ToObjectList<T>(this DataTable table,Func<DataRow,T> convert)
{
List<T> lst = new List<T>();
foreach (DataRow row in table.Rows)
lst.Add(convert(row));
return lst;
}
用法:
var list = myDataTable.ToObjectList(dr=>new Person(dr));
进一步阅读:
类型参数约束
对于泛型类型,不能指定new约束的类型。然而,您可以做的是创建两个不同的约束,如下所示:
public static List<T> ToObjectList<T>(this DataTable table) where T : DataRow where T : new()
这里指定参数T 必须是DataTable类型(或从DataTable派生),并且的新实例将在方法
不行,你只能要求一个带有泛型约束的空构造函数。
另一种模式是需要Load
方法:
public interface ILoadable
{
void Load(DataRow row);
}
public class Person : ILoadable
{
...
public Person() { }
public void Load(DataRow row)
{
PersonID = (int)row["person_id"];
...
}
}
然后你可以这样声明你的方法:
public static List<T> ToObjectList<T>(this DataTable table) where T : ILoadable, new()