反射实体

我们通常会遇到一些要将数据库返回的实体类存入到我们的Model类里面,如果字段不多还好一点,如果是上百字段的实体那就很绝望了,有什么方法可以很轻松的就把这个问题解决了呢?反射实体你值得拥有(滑稽狗头)

 

反射单个Model

  首先要创建一个匿名类型接收你的实体类,这里以EF为例子。

  var Table=db.Table.Where(_=>_.Name=="条件").ToList().FirstOrDefault();

  接收到我们的想要的值之后,还要创建我们准备存储实体的Model类实例

  TableModel Model=new TableModel ();

  接着需要我们创建两个参数准备获取type对象

  var Tab=typeof(Table).GetProperties();

  var Mod=typeof(TableModel).GetProperties();

  为什么要创建这两个参数呢?因为GetProperties()方法是获取当前type(也就是当前class)所有的公共属性,注意是公共属性,也就是说私有属性是不获取的。获取的公共属性包含了字段名和字段类型以及字段中文名等//如:[Display(Name = "字段名的中文名")]

  创建了之后呢,我们就要用foreach去循环你要存储数据的类(也就是你要返回出去的Model类)

  foreach(var item in Mod)

  {

    var Name=item.Name; //获取字段名

    //获取字段名之后,根据字段名去获取数据,这里就要调用接收实体类所有公共属性的那个参数了

    var Date=Tab.FirstOrDefault(_=>_.Name.ToUpper()==Name.ToUpper()); //ToUpper是将字符串转换成大写再去对比数据

    //根据字段名获取数据之后,我们为了容错性,需要逐步判断此字段参数是否拥有可读性和写入性(get;set;)

    if(Date.CanRead)

    {

      var DataValue=Date.GetValue(Table); //这里是获取该字段从数据库取到的数据,GetValue方法需要一个object类型的参数,这里我们把db的数据调用过来就可以了

      //之后接着判断是否拥有写入性

      if(Date.CanWrite)

      {

        //还一个判断是为了避免字段类型不一致的

        if(Date.PropertyType.FullName == item.PropertyType.FullName)

        {

          //最后把值赋值给我们用来存储数据的类

          item.SetValue(Model,DataValue); //SetValue方法有两个参数,一个是Model类参数和一个Value值参数

        }

      }

    }

  }

  如此便大功告成了,最后附上我自己写的代码原图

  

 

  ps:文章乃个人小白的学习笔记。大神勿喷。如果文章有不可之处还望各位指出,避免小白误人子弟

posted @ 2020-01-03 16:00  神乜  阅读(155)  评论(0)    收藏  举报