Gli*_*kot 4 c# generics reflection types system.data.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;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用优秀的FileHelpers库将批量记录导入SQL Server.要使用SqlBulkCopy,我需要一个包含给定类型列的数据表.Filehelpers可以在运行时读取.cs文件并基于此创建您的类型.例如:
System.Type userType = null;
userType = ClassBuilder.ClassFromSourceFile("myclassfile.cs");
Run Code Online (Sandbox Code Playgroud)
我想改变上面的方法,所以它只是在传递一个类型时为我创建列(例如'userType').即方法签名将是这样的:
public static DataTable TypeToDataTable<T>(<T> myType)
Run Code Online (Sandbox Code Playgroud)
并将返回一个包含列的空数据集,准备添加userType行.
我尝试了各种方法 - 任何想法?
Dan*_*rth 11
当你意识到在这种情况下你不需要(甚至可以)使用泛型时,它实际上非常简单:
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;
}
Run Code Online (Sandbox Code Playgroud)
你会这样称呼它:
System.Type userType = null;
userType = ClassBuilder.ClassFromSourceFile("myclassfile.cs");
DataTable emptyDataTable = CreateEmptyDataTable(userType);
Run Code Online (Sandbox Code Playgroud)
最近我正是需要这个,并在 SO 上找到了它。我将问题中的前提与答案结合起来,并决定共享代码,因为两者都不完整:
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;
}
Run Code Online (Sandbox Code Playgroud)