使用C#反射,实现视图模型到数据库模型的属性转换
数据库中的表有时候会有N多个字段,而我们往往只需要操作其中的某一种字段,这种情况,用propertyinfo来实现。
1.一张表有N个对象的时候,我们操作其中的一种属性。例如在数据库中存在学生表(Student)中,只要操作学生的姓名(StuName列)
StuID | StuName | StuClass | StuAge | … |
xiaoliang | 小亮 | ClassOne | 8 | … |
xiaoming | 小明 | ClassTow | 9 | … |
xiaohua | 小华 | ClassThree | 7 | … |
2.而我想要在页面中如下展示数据,并且姓名为可编辑:
学生: | 小亮 |
学生: | 小明 |
学生: | 小华 |
3.将Student表中StuID字段中的所有值封装到Name类中
public class Name
{
public string xiaoliang{get;set;} public string xiaoming{get;set;} public string xiaohua{get;set;} }
[HttpGet]
public ActionResult Index()
{
List<Student> lists = _db.Student.toList(); //拿到数据库中所有的Student对象
Name names = new Name(); //声明一个Name对象
PropertyInfo[] Pros = typeof(Name).GetProperties(); //返回存放了Name类的所有属性的数组
foreach (var pro in Pros) //循环遍历数组
{
string proValue = GetOptions(lists, pro.Name); //获取Student对象中的StuName值
pro.SetValue(names, proValue); //给Name类中的属性进行赋值
}
return View(names); //最后得到的Name类中的,所有属性都赋值了姓名
}
//得到源数据的StuName
private string GetOptions(List<Student> source ,string key)
{
var find = source.FirstOrDefault(o => o.StuName == key);
if (find != null)
{
return find.StuName;
}
}
//写入源数据的StuName
private void SetOptions(List<Student> source, string key, string value)
{
var find = source.FirstOrDefault(o => o.OptionID == key);
if (find != null)
{
find.StuName = value;
}
}