简单测试,不作权威数据
测试结果 json.net 性能更好
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
public static class ConvertHelper<T> where T : new()
{
/// <summary>
/// 利用反射和泛型
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static List<T> ConvertToList(DataTable dt)
{
// 定义集合
List<T> ts = new List<T>();
// 获得此模型的类型
Type type = typeof(T);
//定义一个临时变量
string tempName = string.Empty;
//遍历DataTable中所有的数据行
foreach (DataRow dr in dt.Rows)
{
T t = new T();
// 获得此模型的公共属性
PropertyInfo[] propertys = t.GetType().GetProperties();
//遍历该对象的所有属性
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;//将属性名称赋值给临时变量
//检查DataTable是否包含此列(列名==对象的属性名)
if (dt.Columns.Contains(tempName))
{
// 判断此属性是否有Setter
if (!pi.CanWrite) continue;//该属性不可写,直接跳出
//取值
object value = dr[tempName];
//如果非空,则赋给对象的属性
if (value != DBNull.Value)
pi.SetValue(t, value, null);
}
}
//对象添加到泛型集合中
ts.Add(t);
}
return ts;
}
}
/// <summary>
/// Class TestEntity.
/// </summary>
public class TestEntity
{
public int Int1 { get; set; }
public string String1 { get; set; }
public double Double1 { get; set; }
public bool Bool1 { get; set; }
public Decimal Decimal1 { get; set; }
public DateTime DateTime1 { get; set; }
}
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("Int1", Type.GetType("System.Int32"));
dt.Columns.Add("String1", Type.GetType("System.String"));
dt.Columns.Add("Double1", Type.GetType("System.Double"));
dt.Columns.Add("Bool1", Type.GetType("System.Boolean"));
dt.Columns.Add("Decimal1", Type.GetType("System.Decimal"));
dt.Columns.Add("DateTime1", Type.GetType("System.DateTime"));
Random ran = new Random();
for (int i = 0; i < 10000; i++)
{
dt.Rows.Add(ran.Next(1, 1000), Guid.NewGuid().ToString(), ran.Next(1, 1000), ran.Next(0, 2), ran.Next(1, 1000), DateTime.Now);
}
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
//Json.Net DataTable转Json再转List强类型
string jsonData = JsonConvert.SerializeObject(dt);
var data1 = JsonConvert.DeserializeObject<List<TestEntity>>(jsonData);
stopwatch.Stop();
Console.WriteLine(" Json.Net耗时:" + stopwatch.ElapsedTicks);
stopwatch.Start();
//反射 DataTable转List强类型
var data2 = ConvertHelper<TestEntity>.ConvertToList(dt);
stopwatch.Stop();
Console.WriteLine("反射的方式耗时:" + stopwatch.ElapsedTicks);
Console.ReadKey();
}
}
}