是否可以使用带参数的构造函数约束的泛型方法?

时间:2015-07-14 08:06:52

标签: c#

我有各种代表实体的类,例如:

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约束。

有没有办法有这样的扩展方法?

3 个答案:

答案 0 :(得分:4)

不,您不能要求带参数的构造函数。关于你能做的最好的事情就是要求一个lambda:

(ThisArray[1] as Shape.Polygon).Sides

用法:

if(ThisArray[1] is Shape.Polygon){
    (ThisArray[1] as Shape.Polygon).Sides
}

进一步阅读:

Constraints on type parameters

答案 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()