首页 > 其他分享 > 表达式树对象转换器

表达式树对象转换器

时间:2023-04-04 21:12:40浏览次数:30  
标签:set Name get 对象 public 转换器 Expression Id 表达式

定义两个对象

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}
public class NewPerson
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

创建表达式树转换器

public class ExpressionMapper<TIn, TOut>
    {
        private static Func<TIn, TOut> _mapper = null;
        static ExpressionMapper()
        {
            ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "x");
            List<MemberBinding> bindings = new List<MemberBinding>();

            foreach (var property in typeof(TOut).GetProperties())
            {
                MemberExpression member = Expression.Property(parameterExpression, typeof(TIn).GetProperty(property.Name));
                MemberBinding binding = Expression.Bind(property, member);   // x=>x.Id
                bindings.Add(binding);
            }

            MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), bindings.ToArray());  //new newPersion(){Id=x.Id,Name=x.Name,Age=x.Aget}

            var funcExp = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, parameterExpression);  //  x=> new newPersion(){Id=x.Id,Name=x.Name,Age=x.Aget}
            _mapper = funcExp.Compile();
        }

        public static TOut Mapper(TIn sour)
        {
            return _mapper(sour);
        }
    }

源对象转换为目标对象

var person = new Person()
{
    Id = 1,
    Name = "张三",
    Age = 2
};

var newPersion = ExpressionMapper<Person, NewPerson>.Mapper(person);

标签:set,Name,get,对象,public,转换器,Expression,Id,表达式
From: https://www.cnblogs.com/SSprite/p/17287913.html

相关文章

  • 【flask】蓝图的使用方式 g对象的使用 flask配置数据库连接池
    目录上节回顾今日内容1蓝图的使用2g对象g对象vsrequest对象3数据库连接池上节回顾全局request对象。线程会处理请求,确保线程中的数据不错乱。django_session表:#1cbv使用 -写一个类继承MethodView,写get,post。。。-类属性decorators=[auth,]可以加装饰器......
  • flask,蓝图使用,g对象,数据库连接池
    内容回顾cbv使用写一个类继承MethodView写get,post…类属性decorators=[auth]可以加装饰器CBV执行流程跟django的执行流程一样endpoint作用路径别名add_url_rule(view_func=IndexView.as_view(‘index’))为什么endpoint不传,是被路由装饰器装饰的函数名:函数名._name_装饰......
  • vue数组和对象进行 watch 和 watchEffect 对比
    constarr1=ref([]);constarr2=reactive([]);constobj1=ref({});constobj2=reactive({});watchEffect(()=>{console.log("watchEffectarr1",arr1.value);console.log("watchEffectarr2",arr2)......
  • BOM(Browser Object Model)对象模型
    ?window对象是全局对象,基本BOM的属性和方法都是window的window属性和方法属性方法点击某按钮,回到顶部window.scrollTo(0,0)......
  • flask-蓝图、g对象
    1.蓝图的使用蓝图是由blueprint翻译过来的,作用是之前在一个py文件中写的flask项目,后期划分目录,不用蓝图同样可以划分项目1.1不用蓝图划分项目不使用蓝图划分也可以完成项目需求,但是随着项目深入导入情况越来越多可能会出现导入错误1.项目目录结构:根目录:srcinit.pymodels.......
  • Flask框架使用蓝图划分目录、g对象、使用数据库连接池链接数据库
    目录一、使用蓝图划分项目目录1.蓝图的介绍2.蓝图的使用二、介绍flask框架的g对象1.g对象是什么?2.使用代码再次解释g对象三、使用数据库连接池链接数据库1.引入数据库连接池的概念2.在flask框架中使用数据库连接池的步骤一、使用蓝图划分项目目录1.蓝图的介绍flask框架的目......
  • flask-day3——蓝图的使用、g对象、数据库连接池
    目录一、蓝图(blueprint)1、蓝图介绍2、蓝图的使用3、使用蓝图,划分小型项目目录4、使用蓝图,划分大型项目目录5、其他知识点二、g对象三、数据库连接池四、作业1、什么是gil锁,有什么作用2、python的垃圾回收机制是什么样的3、解释为什么计算密集型用多进程,io密集型用多线程一、蓝图......
  • cron表达式详解
    cron表达式详解形如******这种的表示时间的表达式称之为cron表达式Cron表达式支持七个域(一般只使用6个域)名称 合法值 特殊字符秒 0-59 ,-*/分 0-59 ,-*/时 0-23 ,-*/日 1-31 ,-*?/LWC月 1-12 ,-*/周 1-7(1代表周日,7代表周六) ,-*?/LC#年(可省略) 197......
  • flask框架03 蓝图的使用 g对象 数据库连接池
    今日内容目录今日内容1蓝图的使用2g对象3数据库连接池1蓝图的使用#blueprint翻译过来的,称之为蓝图#作用是:之前全在一个py中写flask项目,后期肯定要划分目录#不用蓝图,划分目录 no_blueprint_flask#项目名src#核心源码位置__i......
  • flask项目结构参考与g对象
    flask项目结构参考与g对象flask本身是一个轻量化的框架,如果选择flask做项目,大部分时候,可能并不是打算运行特别庞大的项目,因此flask项目的结构并没有特别统一的规范,这篇文章仅作参考。flask蓝图蓝图——blueprint蓝图的基本使用fromflaskimportFlask,Blueprintapp=Fla......