是否有可能具有带参数构造函数约束的泛型方法?

本文关键字:约束 泛型方法 构造函数 参数 有可能 是否 | 更新日期: 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()