运用泛型和反射实现的转换,很给力。代码中掺杂详尽注释,稍微了解一下泛型和反射便可以了解转换的实质。可以直接复制粘贴进行调用哦。
public class DtConverToList<T> where T : new()
{
public static List<T> DtToList(DataTable dt)
{
//定义集合
List<T> ListCollection = new List<T>(dt.Rows.Count);
//获得 T 模型类型
Type T_type = typeof(T);
//获得 T 模型类型公共属性
PropertyInfo[] Proper = T_type.GetProperties();
//临时变量,存储变量模型公共属性Name
string Tempname = "";
//遍历参数 DataTable的每行
foreach (DataRow Dr in dt.Rows)
{
//实例化 T 模版类
T t = new T();
//遍历T 模版类各个属性
#region
foreach (PropertyInfo P in Proper)
{
//取出类属性之一
Tempname = P.Name;
//判断DataTable中是否有此列
if (dt.Columns.Contains(Tempname))
{
//判断属性是否可写属性
if (!P.CanWrite)
{
continue;
}
try
{
//得到Datable单元格中的值
object value = Dr[Tempname];
//得到 T 属性类型
Type ProType = P.PropertyType;
//判断类型赋值
if (value != DBNull.Value)
{
//
if (value.GetType() == ProType)
{
P.SetValue(t, value, null);
}
else
{
if (ProType == typeof(string))
{
string Temp = value.ToString();
P.SetValue(t, Temp, null);
}
else if (ProType == typeof(byte))
{
byte Temp = Convert.ToByte(value);
P.SetValue(t, Temp, null);
}
else if (ProType == typeof(short))
{
short Temp = short.Parse(value.ToString());
P.SetValue(t, Temp, null);
}
else if (ProType == typeof(long))
{
long Temp = long.Parse(value.ToString());
P.SetValue(t, Temp, null);
}
else if (ProType == typeof(Int64))
{
Int64 Temp = Convert.ToInt64(value);
P.SetValue(t, Temp, null);
}
else if (ProType == typeof(Int32))
{
Int32 Temp = Convert.ToInt32(value);
P.SetValue(t, Temp, null);
}
else if (ProType == typeof(Int16))
{
Int16 Temp = Convert.ToInt16(value);
P.SetValue(t, Temp, null);
}
else
{
object Temp = Convert.ChangeType(value, ProType);
P.SetValue(t, Temp, null);
}
}
}
}
catch (Exception)
{
throw;
}
}
}
#endregion
ListCollection.Add(t);
}
return ListCollection;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构