反射实体
我们通常会遇到一些要将数据库返回的实体类存入到我们的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:文章乃个人小白的学习笔记。大神勿喷。如果文章有不可之处还望各位指出,避免小白误人子弟

浙公网安备 33010602011771号