我有各种代表实体的类,例如:
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
作为参数的contstructor约束。
有没有办法有这样的扩展方法?
答案 0 :(得分:4)
不,您不能要求带参数的构造函数。关于你能做的最好的事情就是要求一个lambda:
(ThisArray[1] as Shape.Polygon).Sides
用法:
if(ThisArray[1] is Shape.Polygon){
(ThisArray[1] as Shape.Polygon).Sides
}
进一步阅读:
答案 1 :(得分:0)
您无法为通用类型指定 新 约束的类型。但是,您可以创建两个不同的约束,如下所示:
public static List<T> ToObjectList<T>(this DataTable table) where T : DataRow where T : new()
在此指定您的参数T 必须是DataTable 类型(或从DataTable派生),并且的新实例可以在您的方法中创建
答案 2 :(得分:0)
不,你只能要求带有通用约束的空构造函数。
另一种模式是要求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()