C#来自Datatable或DataRow的多对一反射

本文关键字:多对一 反射 DataRow 来自 Datatable | 更新日期: 2023-09-27 18:25:03

我有一个类

class Person {
 public string Name {get; set;}
 public int Age {get; set;}
 public string Phone {get; set;}
 // many other properties
}

这个人的数据来自DataRow,问题是没有一对一的映射,如下所示:-

 public DataRow doMapping()
{
 DataRow row = new DataRow();
 FillDataInto(row);
 Person p1 = new Person(); 
 p1.Name = row["FirstName"] + " " + row["LastName"];
 p1.Age = row["Age"];
 p1.Phone = row["Phone"] + " " + row["Extension"];
 p1.Prop1 = row["Prop1"];
 p1.PropXY = row["PropXY"];
 // many others ... 

}

如图所示,一些属性来自我的数据库的不同列。我需要一些帮助来创建一个反射函数来将行属性映射到Person

目前我有以下内容,它将用于一对一映射,
(就像上面例子中的Age):-

public DataRow doMapping(){
 DataRow row = new DataRow();
 FillDataInto(row); 
 Person p1 = new Person();
 Type type = Person.GetType();
 PropertyInfo[] props = type.getProperties();
 foreach(PropertyInfo p in props)
 {
   string name = p.Name;
   p.SetValue(p1, row[name]);
 }
}

我只需要改进这一点来处理前面提到的情况
(一旦我理解了核心逻辑,我可以稍后进行清理)

C#来自Datatable或DataRow的多对一反射

您可以在dataTable中拥有Name和Phone所需的列。

为Name和Phone添加两个新列,并将其定义为与用于属性的逻辑相同。如果要从数据库Select语句加载此dataTable,请在SQL语句本身中添加两个新列Name和Phone,其逻辑与用于属性的逻辑相同。

然后,一对一属性映射的实现就可以工作了。