如何反序列化数据表以列出 <T>
How to deserialize a datatable to list<T>
我正在寻找一个库(最好是 nuget),它将列名与通用对象匹配的数据表转换为该对象的列表。例如,如果我有一个 class:
public class foo{
public string bar{get;set;}
public int count{get;set;}
}
还有一个数据表
+---------+-------+
| bar | count |
+---------+-------+
| string1 | 1 |
| string2 | 5 |
+---------+-------+
能够调用
List<foo> foos =DTSerializer.Deserialize<foo>(dt).ToList();
想想你需要的是一点反射魔法而不是序列化:
class Program
{
static void Main(string[] args)
{
DataTable table = new DataTable();
table.Columns.Add("foo",typeof(string));
table.Columns.Add("bar",typeof(int));
table.Rows.Add("row1", 1);
table.Rows.Add("row2", 2);
var result = table.MapTableToList<foobar>();
foreach (foobar item in result)
{
Console.WriteLine("{0}:{1}", item.foo, item.bar);
}
}
}
class foobar
{
public string foo { get; set; }
public int bar { get; set; }
}
public static class ExtensionMethods
{
public static List<T> MapTableToList<T>(this DataTable table) where T : new ()
{
List<T> result = new List<T>();
var Type = typeof(T);
foreach (DataRow row in table.Rows)
{
T item = new T();
foreach (var property in Type.GetProperties())
{
property.SetMethod.Invoke(item, new object[] { row[table.Columns[property.Name]] });
}
result.Add(item);
}
return result;
}
}
这只有在您的列名与属性匹配时才有效。
为 nullable 和
增强此扩展代码
public static List<T> MapTableToList<T>(this DataTable table) where T : new()
{
List<T> result = new List<T>();
var Type = typeof(T);
foreach (DataRow row in table.Rows)
{
T item = new T();
foreach (var property in Type.GetProperties())
{
if(table.Columns.IndexOf(property.Name) > -1)
{
if (row[table.Columns[property.Name]] == System.DBNull.Value && property.GetMethod.ReturnType.Name.IndexOf("Nullable") > -1)
{
property.SetMethod.Invoke(item, new object[] { null });
}
else
{
property.SetMethod.Invoke(item, new object[] { row[table.Columns[property.Name]] });
}
}
}
result.Add(item);
}
return result;
}
我正在寻找一个库(最好是 nuget),它将列名与通用对象匹配的数据表转换为该对象的列表。例如,如果我有一个 class:
public class foo{
public string bar{get;set;}
public int count{get;set;}
}
还有一个数据表
+---------+-------+
| bar | count |
+---------+-------+
| string1 | 1 |
| string2 | 5 |
+---------+-------+
能够调用
List<foo> foos =DTSerializer.Deserialize<foo>(dt).ToList();
想想你需要的是一点反射魔法而不是序列化:
class Program
{
static void Main(string[] args)
{
DataTable table = new DataTable();
table.Columns.Add("foo",typeof(string));
table.Columns.Add("bar",typeof(int));
table.Rows.Add("row1", 1);
table.Rows.Add("row2", 2);
var result = table.MapTableToList<foobar>();
foreach (foobar item in result)
{
Console.WriteLine("{0}:{1}", item.foo, item.bar);
}
}
}
class foobar
{
public string foo { get; set; }
public int bar { get; set; }
}
public static class ExtensionMethods
{
public static List<T> MapTableToList<T>(this DataTable table) where T : new ()
{
List<T> result = new List<T>();
var Type = typeof(T);
foreach (DataRow row in table.Rows)
{
T item = new T();
foreach (var property in Type.GetProperties())
{
property.SetMethod.Invoke(item, new object[] { row[table.Columns[property.Name]] });
}
result.Add(item);
}
return result;
}
}
这只有在您的列名与属性匹配时才有效。
为 nullable 和
增强此扩展代码public static List<T> MapTableToList<T>(this DataTable table) where T : new()
{
List<T> result = new List<T>();
var Type = typeof(T);
foreach (DataRow row in table.Rows)
{
T item = new T();
foreach (var property in Type.GetProperties())
{
if(table.Columns.IndexOf(property.Name) > -1)
{
if (row[table.Columns[property.Name]] == System.DBNull.Value && property.GetMethod.ReturnType.Name.IndexOf("Nullable") > -1)
{
property.SetMethod.Invoke(item, new object[] { null });
}
else
{
property.SetMethod.Invoke(item, new object[] { row[table.Columns[property.Name]] });
}
}
}
result.Add(item);
}
return result;
}