C# 获取数据表并从中填充模型
在我的项目中,我有一个填充方法C# 获取数据表并从中填充模型,c#,c#-4.0,datatable,object-oriented-analysis,C#,C# 4.0,Datatable,Object Oriented Analysis,在我的项目中,我有一个填充方法 public IList<MyModel> Fill(DataTable dt) { IList<MyModel> IProperty = new List<MyModel>(); for (int i = 0; i < dt.Rows.Count; i++) { MyModel Property = new MyModel
public IList<MyModel> Fill(DataTable dt)
{
IList<MyModel> IProperty = new List<MyModel>();
for (int i = 0; i < dt.Rows.Count; i++)
{
MyModel Property = new MyModel
{
Name= dt.Rows[i]["Name"].ToString(),
Surname = dt.Rows[i]["Surname"].ToString(),
Age = dt.Rows[i]["Age"].ToString(),
};
IProperty.Add(Property);
}
return IProperty;
}
公共IList填充(数据表dt)
{
IList IProperty=新列表();
对于(int i=0;i
它从数据表填充我的模型。但我必须为所有模型编写这个填充方法。我不想一直写这个方法。我需要一个解决方案。我愿意接受任何建议
不:我不想使用实体框架或其他ORM框架。如果可以确保对象的字段名和属性具有相同的名称,请尝试以下操作:
public IEnumerable<T> Fill<T>(DataTable dt)
where T : new()
{
return dt.AsEnumerable().Select(row =>
{
var obj = new T();
var properties =
from p in obj.GetType().GetProperties()
join c in dt.Columns.Cast<DataColumn>() on p.Name equals c.ColumnName
select new {p, c};
foreach (var item in properties)
item.p.SetValue(obj, row[item.c]);
return obj;
});
}
公共IEnumerable填充(数据表dt)
其中T:new()
{
返回dt.AsEnumerable().Select(行=>
{
var obj=新的T();
变量属性=
来自obj.GetType().GetProperties()中的p
在p.Name上的dt.Columns.Cast()中连接c.Name等于c.ColumnName
选择新的{p,c};
foreach(属性中的变量项)
项目p.设定值(obj,第行[项目c]);
返回obj;
});
}
没有一种神奇的方法适用于所有类型。可能是反射,但我强烈建议不要这样做。不同的Fill实现之间会有什么变化?IProperty和属性类型会发生变化。如果Datatable值也发生了变化,那么您应该为每个返回的类型单独实现。和任何可能的单一方法解决方案相比,这将大大提高代码的可读性。