C#ORM中的对象映射
使用Linq.Expressions来动态生成映射方法
1.我们先写个简单的类Test,包含一个ID和Name。
public class Test
{
public int? ID { get; set; }
public string Name { get; set; }
}
2.需要手工写简单映射代码,暂时不考虑大小写等问题,代码如下。
/// <summary>
/// 设置属性
/// </summary>
static void Set(Test t,string name,object value)
{
switch (name)
{
case "ID":t.ID = Convert.ToInt32(value);break;
case "Name": t.Name = Convert.ToString(value); break;
}
}
/// <summary>
/// 获取属性
/// </summary>
static Object Get(Test t, string name)
{
switch (name)
{
case "ID": return t.ID;
case "Name": return t.Name;
}
return null;
}
3.目标就是通过Expressions来自动产生上面2个方法,先定义Set方法的3个参数Test ,name,value(不了解Expressions点击)
ParameterExpression val = Expression.Parameter(typeof(object));//value
ParameterExpression instance = Expression.Parameter(typeof(object));//Test
ParameterExpression nameexp = Expression.Parameter(typeof(string));//name
4.通过反射得到所有的属性集合,再根据属性集合产生case 语句,以下为Set方法的表达式
var ps = t.GetProperties();//t为typeof(Test)
List<SwitchCase> lt = new List<SwitchCase>();
foreach (var n in ps)
{
if (!n.CanWrite) { continue; }
Expression tp = Expression.Convert(val, n.PropertyType); //类型转换,此为隐式转换。目前不考虑强行转换类型
lt.Add(Expression.SwitchCase(Expression.Call(Expression.Convert(instance, t), n.GetSetMethod(), tp), Expression.Constant(n.Name)));
}
Expression p1 = Expression.Switch(nameexp, lt.ToArray());
LambdaExpression exp = Expression.Lambda(p1, instance, nameexp, val);//转换为LambdaExpression 后就可以编译了
Action<object, string, object> act = exp.Compile() as Action<object, string, object>;
5.Get方法的表达式
var ps = t.GetProperties();
List<SwitchCase> lt = new List<SwitchCase>();
ParameterExpression instance = Expression.Parameter(typeof(object));
ParameterExpression nameexp = Expression.Parameter(typeof(string));
foreach (var n in ps)
{
if (!n.CanRead) { continue; }
lt.Add(Expression.SwitchCase(Expression.Convert(Expression.Call(Expression.Convert(instance, t), n.GetGetMethod(), null), typeof(object)), Expression.Constant(n.Name)));
}
Expression p1 = Expression.Switch(nameexp, Expression.Constant(null), lt.ToArray());
LambdaExpression exp = Expression.Lambda(p1, instance, nameexp);
Func<object, string, object> func = exp.Compile() as Func<object, string, object>;
以上只是简单的案例代码,用于说明Expression来产生映射代码,查看完整代码,虽然更多人用Emit,但本质是一样。
C#ORM中的对象映射的更多相关文章
- django的orm中F对象的使用
		今天不巧就用上了. 就是将数据库的字段,自增1的场景. from django.db.models import F DeployPool.objects.filter(name=deployvers ... 
- Mybaits的中的对象映射(包含仅有基本数据类型的属性的和对象类型的属性的)
		转:https://blog.csdn.net/cjt20100/article/details/46547617. 1 constructor – 用来将结果反射给一个实例化好的类的构造器 a ... 
- ASP.NET Core 中的对象映射之 AutoMapper
		目录 AutoMapper 简介 AutoMapper 使用 初始化 Profile设置 扁平化映射 集合映射 投影 条件映射 值转换 设置转换前后行为 配置验证及设置 反向映射 自定义转换器 自定义 ... 
- ORM中基于对象查询与基于queryset查询
		感谢老男孩~ 一步一步走下去 前面是视图函数 后面是表结构models.py from django.shortcuts import render, HttpResponse from djang ... 
- odoo ORM中的filed的关系映射的使用详解1
		前言 前面我们详细讲解了odoo ORM中fields中的常见属性的使用,根据不同的属性可以对字段进行不同的限制操作,比如readonly只读,store是否存储到数据库.今天我们继续研究ORM中的关 ... 
- 一篇搞定SQLAlchemy--关系对象映射
		要使用SQLAlchemy,必须先下载这个模块 pip3 install sqlalchemy 或 pycharm File--> Settings-->project...-->P ... 
- 【5min+】 对象映射只有AutoMapper?试试Mapster
		系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ... 
- [非专业翻译] 高性能对象映射框架 - Mapster
		[非专业翻译] 高性能对象映射框架 - Mapster 系列介绍 [非专业翻译] 是对没有中文文档进行翻译的系列博客,文章由机翻和译者自己理解构成,和原文相比有所有不通,但意思基本一致. 因个人能力有 ... 
- 对象映射 - Mapping.Mapster
		前言 在项目中我们会经常遇到对象的映射,比如像Model和Dto之间的映射,或者是对象的深拷贝,这些都是需要我们自己实现的.此时,项目中会出现很多初始化对象的代码,这些代码写起来相当的枯燥乏味,那么有 ... 
随机推荐
- YOLO V1损失函数理解
			YOLO V1损失函数理解: 首先是理论部分,YOLO网络的实现这里就不赘述,这里主要解析YOLO损失函数这一部分. 损失函数分为三个部分: 代表cell中含有真实物体的中心. pr(object) ... 
- jsp页面中将CST时间格式化为年月日
			引入: <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> 格式化: ... 
- Spring_AOP基于AspectJ的注解开发&JDBC的模板使用&事务管理(学习笔记3)
			一:AOP基于AspectJ的注解开发 1,简单的实例: 1)引入相应的jar包  2)在配置文件里引入相关约束 <beans xmlns="http://www.springfra ... 
- Node.js socket 双向通信
			使用场景: 聊天室:大量数据常驻交互: 技术栈: Node.js, Vue.js || 原生JS 服务端代码: const app = require('http').createServe ... 
- TensorFlow笔记-变量,图,会话
			变量 存储一些临时值的作用或者长久存储.在Tensorflow中当训练模型时,用变量来存储和更新参数.变量包含张量(Tensor)存放于内存的缓存区.建模时它们需要被明确地初始化,模型训练后它们必须被 ... 
- MyBatis 中 @Param 注解的四种使用场景,最后一种经常被人忽略!
			有一些小伙伴觉得 MyBatis 只有方法中存在多个参数的时候,才需要添加 @Param 注解,其实这个理解是不准确的.即使 MyBatis 方法只有一个参数,也可能会用到 @Param 注解. 但是 ... 
- Linux环境Oracle数据库访问出现ORA-01034错误:oracle not available解决
			首先将用户切换为Oracle用户登录,su - oracle; 进入:sqlplus / as sysdba: 问题现象: SQL> select * from dba_users; selec ... 
- tomcat用做图片服务器
			最近做了个小网站,就是用tinyce富文本编辑器,https://www.511easy.com/ 保持字体排版和图片 发现博客园的图片,一天之后就无法显示 就想着自己做一个图片服务器,上传图片到指定 ... 
- 实现一个Golang的reverse函数
			Reverse函数,用来反转列表,本例子用golang实现,反转一个slice列表. 因为slice是引用类型,因此直接修改参数的值即可. func myReverse(l []string) { f ... 
- ubuntu 单机配置hadoop
			前言 因为是课程要求,所以在自己电脑上安装了hadoop,由于没有使用虚拟机,所以使用单机模拟hadoop的使用,可以上传文件,下载文件. 1.安装配置JDK Ubuntu18.04是自带Java1. ... 
