c#-从类(而不是实例列表)创建数据表

c#-从类(而不是实例列表)创建数据表,c#,generics,reflection,types,system.data.datatable,C#,Generics,Reflection,Types,System.data.datatable,这个问题涉及泛型和类型以及数据表 以下代码段在网络中随处可见,并基于泛型类型创建了一个datatable: public static DataTable ListToDataTable<T>(List<T> list) { DataTable dt = new DataTable(); foreach (PropertyInfo info in typeof(T).GetProperties()) { dt.Columns.Ad

这个问题涉及泛型和类型以及数据表

以下代码段在网络中随处可见,并基于泛型类型创建了一个datatable:

public static DataTable ListToDataTable<T>(List<T> list)
{
    DataTable dt = new DataTable();

    foreach (PropertyInfo info in typeof(T).GetProperties())
    {
        dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
    }
    foreach (T t in list)
    {
        DataRow row = dt.NewRow();
        foreach (PropertyInfo info in typeof(T).GetProperties())
        {
            row[info.Name] = info.GetValue(t, null);
        }
        dt.Rows.Add(row);
    }
    return dt;
}
我想更改上面的方法,以便在传递类型(例如“userType”)时它只为我创建列。即方法签名类似于:

public static DataTable TypeToDataTable<T>(<T> myType)
公共静态数据表类型ToDataTable(myType)
并将返回一个包含列的空数据集,准备将userType行添加到其中


我尝试过各种方法-有什么想法吗?

当您意识到在这种情况下不需要(甚至可以)使用泛型时,实际上非常简单:

public static DataTable CreateEmptyDataTable(Type myType)
{
    DataTable dt = new DataTable();

    foreach (PropertyInfo info in myType.GetProperties())
    {
        dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
    }

    return dt;
}
你可以这样称呼它:

System.Type userType = null;
userType = ClassBuilder.ClassFromSourceFile("myclassfile.cs");
DataTable emptyDataTable = CreateEmptyDataTable(userType);

最近我正好需要这个,就在这里找到了。我将问题的前提与答案结合起来,决定分享代码,因为两者都不完整:

private DataTable CreateDataTableFromObjects<T>(List<T> items, string name = null)
{
    var myType = typeof(T);
    if (name == null)
    {
        name = myType.Name;
    }
    DataTable dt = new DataTable(name);
    foreach (PropertyInfo info in myType.GetProperties())
    {
        dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
    }
    foreach (var item in items)
    {
        DataRow dr = dt.NewRow();
        foreach (PropertyInfo info in myType.GetProperties())
        {
            dr[info.Name] = info.GetValue(item);
        }
        dt.Rows.Add(dr);
    }
    return dt;
}
private DataTable CreateDataTableFromObjects(列表项,字符串名称=null)
{
var myType=typeof(T);
if(name==null)
{
name=myType.name;
}
DataTable dt=新的DataTable(名称);
foreach(myType.GetProperties()中的PropertyInfo信息)
{
添加(新数据列(info.Name,info.PropertyType));
}
foreach(项目中的var项目)
{
DataRow dr=dt.NewRow();
foreach(myType.GetProperties()中的PropertyInfo信息)
{
dr[info.Name]=info.GetValue(项);
}
dt.Rows.Add(dr);
}
返回dt;
}

谢谢,太好了!出于某些愚蠢的原因,我试图在参数中添加一个参数,而您的方法正是补救方法。
private DataTable CreateDataTableFromObjects<T>(List<T> items, string name = null)
{
    var myType = typeof(T);
    if (name == null)
    {
        name = myType.Name;
    }
    DataTable dt = new DataTable(name);
    foreach (PropertyInfo info in myType.GetProperties())
    {
        dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
    }
    foreach (var item in items)
    {
        DataRow dr = dt.NewRow();
        foreach (PropertyInfo info in myType.GetProperties())
        {
            dr[info.Name] = info.GetValue(item);
        }
        dt.Rows.Add(dr);
    }
    return dt;
}