C#--Mapster(高性能映射)用法

1.Nuget安装Mapster包引用

2.界面XAML部分

<Window x:Class="WpfApp35.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp35"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><Button Content="1.简单映射" HorizontalAlignment="Left" Margin="345,145,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1" Height="52"/><Button Content="2.复杂映射" HorizontalAlignment="Left" Margin="345,235,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_2" Height="52"/><Button Content="3.映射扩展" HorizontalAlignment="Left" Margin="345,320,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_3" Height="52"/></Grid>
</Window>

3.脚本.cs部分 

using Mapster;
using MapsterMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Expression = System.Linq.Expressions.Expression;namespace WpfApp35
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();// 全局配置//TypeAdapterConfig.GlobalSettings.Default.CamelCase(true); // 将属性名称转换为小驼峰命名}//软件框架搭建  wpf+efcore+ct(CommunityToolkit)+s7net+mapster//1.简单映射private void Button_Click_1(object sender, RoutedEventArgs e){//阶段一  简单使用阶段部分  Student==>StudentDto//上面简单映射,但是类StudentDto中的CourceName属性没有被映射,通过下面方法可对属性设置匹配关系,给CourceName属性映射Student stu = new Student();stu.AGE = 25;stu.ID = "1";stu.CID = "321281199505290919";stu.NAME = "陈兆杰";Cource cource = new Cource();cource.ID = "1";cource.CourceName = "数学";cource.Grade = 80.56;stu.Cource = cource;StudentDto stuDto = new StudentDto();{//方法一:stuDto = stu.Adapt<StudentDto>();//stu实例映射为StudentDto类型MessageBox.Show($"stuDto.CourceName: {stuDto.CourceName}");//方法二:stu.Adapt(stuDto);//stu实例映射为stuDto实例,相同的名称字段属性将会自动映射MessageBox.Show($"stuDto.CourceName: {stuDto.CourceName}");//方法三:IMapper mapper = new Mapper();stuDto = mapper.Map<StudentDto>(stu);// stu实例映射为StudentDto类型MessageBox.Show($"stuDto.CourceName: {stuDto.CourceName}");//方法四:mapper.Map(stu, stuDto);//stu实例映射为stuDto实例,相同的名称字段属性将会自动映射MessageBox.Show($"stuDto.CourceName: {stuDto.CourceName}");}}//2.复杂映射private void Button_Click_2(object sender, RoutedEventArgs e){//阶段二  复杂映射  Student==>StudentDtoStudent stu = new Student();stu.AGE = 25;stu.ID = "1";stu.CID = "321281199505290919";stu.NAME = "陈兆杰";Cource cource = new Cource();cource.ID = "1";cource.CourceName = "数学";cource.Grade = 80.56;stu.Cource = cource;StudentDto stuDto = new StudentDto();{TypeAdapterConfig config = new TypeAdapterConfig();//建立映射关系一, NewConfig 删除任何现有配置{//配置里面设置强行绑定项部分config.NewConfig<Student, StudentDto>().Map(dto => dto.ID, d => d.ID).Map(dto => dto.NAME, d => d.NAME).Map(dto => dto.CourceName, s => s.Cource.CourceName);}//建立映射关系二,而 ForType 创建或增强配置。{//        config.ForType<Student, StudentDto>()//.Map(dto => dto.ID, d => d.ID).Map(dto => dto.NAME, d => d.NAME).Map(dto => dto.CourceName, s => s.Cource.CourceName);}stuDto = stu.Adapt<StudentDto>(config);//根据config配置,映射stu实体为StudentDto类型MessageBox.Show($"stuDto.CourceName: {stuDto.CourceName}");}}//映射扩展private void Button_Click_3(object sender, RoutedEventArgs e){Student stu = new Student{age = 25,id = 1,name = "陈兆杰111",classes = classes};StudentDto StuDto1 = ExpressionMapper.Mapper(stu, s => new StudentDto{classesName = s.classes.name,});}/// <summary>/// 可以处理复杂映射/// </summary>/// <typeparam name="TIn">输入类</typeparam>/// <typeparam name="TOut">输出类</typeparam>/// <param name="expression">表达式目录树,可以为null</param>/// <param name="tIn">输入实例</param>/// <returns></returns>public static TOut Mapper<TIn, TOut>(TIn tIn, Expression<Func<TIn, TOut>> expression = null){ParameterExpression parameterExpression = null;List<MemberBinding> memberBindingList = new List<MemberBinding>();parameterExpression = Expression.Parameter(typeof(TIn), "p");if (expression != null){parameterExpression = expression.Parameters[0];if (expression.Body != null){memberBindingList.AddRange((expression.Body as MemberInitExpression).Bindings);}}foreach (var item in typeof(TOut).GetProperties()){if (typeof(TIn).GetProperty(item.Name) != null){MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name));MemberBinding memberBinding = Expression.Bind(item, property);memberBindingList.Add(memberBinding);}if (typeof(TIn).GetField(item.Name) != null){MemberExpression property = Expression.Field(parameterExpression, typeof(TIn).GetField(item.Name));MemberBinding memberBinding = Expression.Bind(item, property);memberBindingList.Add(memberBinding);}}foreach (var item in typeof(TOut).GetFields()){if (typeof(TIn).GetField(item.Name) != null){MemberExpression property = Expression.Field(parameterExpression, typeof(TIn).GetField(item.Name));MemberBinding memberBinding = Expression.Bind(item, property);memberBindingList.Add(memberBinding);}if (typeof(TIn).GetProperty(item.Name) != null){MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name));MemberBinding memberBinding = Expression.Bind(item, property);memberBindingList.Add(memberBinding);}}MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList.ToArray());Expression<Func<TIn, TOut>> lambda = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, new ParameterExpression[]{parameterExpression});Func<TIn, TOut> func = lambda.Compile();//获取委托return func.Invoke(tIn);}}public class Student{public string ID { get; set; }public string NAME { get; set; }public int AGE { get; set; }public string CID { get; set; }public Cource Cource { get; set; }}public class Cource{public string ID { get; set; }public string CourceName { get; set; }public double Grade { get; set; }}public class StudentDto{public string ID { get; set; }public string NAME { get; set; }public string CourceName { get; set; }}
}

4.小结 

        Mapster库是一个用于对象映射的工具,它的作用就像是帮助你把一个对象中的数据复制到另一个对象中。简单来说,当你需要把一个类的数据转换成另一个类的数据时,Mapster可以帮助你快速、方便地实现这个转换过程,省去了手动赋值的繁琐工作。这对于在应用程序中处理不同类型对象之间的数据转换非常有用,让你可以更轻松地管理和操作数据。

应用场景:

        当你开发一个电子商务网站时,假设你有一个名为 Product 的类,表示网站上的商品信息,包括商品名称、价格、描述等属性。另外你还有一个名为 ProductViewModel 的类,表示在网页上展示商品信息所需的属性,比如显示的商品名称、价格、缩略图等。

你可以使用 Mapster 库来处理这两个类之间的数据映射。比如,当你从数据库中查询到了 Product 对象,想要在网页上展示商品信息时,你可以使用 Mapster 来将 Product 对象映射成 ProductViewModel 对象,这样就可以方便地在网页上展示商品信息,而不需要手动复制每个属性的数值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/18194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JQuery 入门

一、jQuery 概述 1、JavaScript 库 仓库:可以把很多东西放到这个仓库里面。找东西只需要到仓库里面查找就可以 JavaScript 库&#xff1a;即library&#xff0c;是一个封装好的特定的集合&#xff08;方法和函数&#xff09;。从封装一大堆函数的角度理解库&#xff0c;就是在…

基于MyBatisPlus表结构维护工具

SuperTable表结构维护工具 一、简述 用于同步表实体与数据库表结构&#xff0c;同步建表、删改字段、索引&#xff0c;种子数据的工具… 一、开发环境 JDK&#xff1a;JDK8SpringBoot&#xff1a;2.7.2MyBatisPlus: 3.5.6MySQL: 5.7其他依赖&#xff1a;略 二、特性 表结…

论文阅读笔记:Task-Customized Mixture of Adapters for General Image Fusion

论文阅读笔记&#xff1a;Task-Customized Mixture of Adapters for General Image Fusion 1 背景2 创新点3 方法4 模块4.1 任务定制混合适配器4.2 提示生成4.3 提示驱动融合4.4 互信息正则化MIR4.5 任务定制化损失 5 实验5.1 VIF任务5.2 MEF任务5.3 MFF任务5.4 消融实验5.5 性…

json/excel文件上传下载工具方法汇总

文章目录 浏览器下载json文件浏览器下载excel文件【Workbook】浏览器导入json文件【ObjectMapper】浏览器导入excel文件【Workbook】ResourceLoader读取类路径下单个jsonResourceLoader读取类路径下所有json文件 浏览器下载json文件 Operation(summary "设备模型导出(带分…

java源码,MES系统源码,企业生产过程执行系统源码,计划排产管理、生产调度管理、库存管理、质量管理

企业级MES系统源码&#xff0c;生产管理系统源码 MES制造企业生产过程执行系统&#xff0c;是一套面向制造企业车间执行层的生产信息化管理系统。MES可以为企业提供包括制造数据管理、计划排产管理、生产调度管理、库存管理、质量管理、工作中心、设备管理、工具工装管理、采购…

国内半导体龙头企业的自动化转型之旅

在当今高速发展的科技时代&#xff0c;半导体行业正迎来前所未有的挑战与机遇。位于此浪潮前端的&#xff0c;是国内一家领先的半导体集成电路封装测试企业。凭借其规模和创新实力&#xff0c;该公司不仅在国内市场名列前茅&#xff0c;更是在全球半导体行业中占据了一席之地。…

ArcGIS基本操作-常用的空间分析工具梳理

ArcGIS空间分析工具使用 如果我们在进行科研时需要将研究区地形地貌作为一项指标的话&#xff0c;将可能遇到坡度、坡向、地形起伏度、地表切割深度等因子计算&#xff0c;下面我向大家介绍如何利于ArcGIS软件的空间分析工具&#xff0c;基于高程数据&#xff0c;分析重庆市的…

Javascript--词法作用域

词法作用域 词法阶段 大部分标准化语言编辑器的第一个工作阶段叫做词法化&#xff0c;词法化会对源代码中的字符进行检查&#xff0c;如果是有状态的解析过程&#xff0c;还会赋予单词语义。 简单来说&#xff0c;词法作用域就是在词法阶段的作用域&#xff0c; function fo…

错误模块路径: ...\v4.0.30319\clr.dll,v4.0.30319 .NET 运行时中出现内部错误,进程终止,退出代码为 80131506。

全网唯一解决此BUG的文章&#xff01;&#xff01;&#xff01; 你是否碰到了以下几种问题&#xff1f;先说原因解决思路具体操作1、首先将你C:\Windows\Microsoft.NET\文件夹的所有者修改为你当前用户&#xff0c;我的是administrator。2、修改当前用户权限。3、重启电脑4、删…

前端Vue小兔鲜儿电商项目实战Day01

一、项目介绍 1. 项目技术栈 2. 项目规模 3. 项目亮点 4. 课程安排 5. 适合人群 二、Vue3组合式API体验 1. 通过一个Counter案例体验Vue3新引入的组合式API ①Vue2的代码 <template><button click"addCount"> {{ count }}</button> </templ…

GPT-4o和GPT-4有什么区别?我们还需要付费开通GPT-4?

GPT-4o 是 OpenAI 最新推出的大模型&#xff0c;有它的独特之处。那么GPT-4o 与 GPT-4 之间的主要区别具体有哪些呢&#xff1f;今天我们就来聊聊这个问题。 目前来看&#xff0c;主要是下面几个差异。 响应速度 GPT-4o 的一个显著优势是其处理速度。它能够更快地回应用户的查…

SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测预测效果基本介绍程序设…

双指针技巧,链表

双指针链表 虚拟头节点双指针&#xff0c;都要用虚拟1头节点 合并两个有序链表 设置双指针&#xff0c;都指向虚拟头节点 ListNode list1 代表的是头节点 class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode dummynew ListNode(-1…

windows帐户自动被锁定解决方法

处理方法方法一&#xff1a; 运行-gpedit.msc&#xff0c;打开组策略&#xff0c; 处理方法方法二&#xff1a; 运行-gpedit.msc&#xff0c;打开组策略&#xff0c; 在本地组策略编辑器页面中&#xff0c;选择计算机配置 > Windows设置 > 安全设置 > 账户策略 > 账…

C语言学习笔记之结构篇

C语言是一门结构化程序设计语言。在C语言看来&#xff0c;现实生活中的任何事情都可看作是三大结构或者三大结构的组合的抽象&#xff0c;即顺序&#xff0c;分支&#xff08;选择&#xff09;&#xff0c;循环。 所谓顺序就是一条路走到黑&#xff1b;生活中在很多事情上我们都…

寒冬来了,字节跳动开启裁员新模式。。

大家好&#xff0c;我是白露啊。 不得不说&#xff0c;字节跳动还是真的会搞事啊。 最近一段时间&#xff0c;字节搞出了一个裁员新模式&#xff1a;“细水长流”。这个寓意和“财&#xff08;裁&#xff09;源&#xff08;员&#xff09;广进”计划差不多了&#xff0c;只不…

python如何巧妙地利用内置函数与列表切片组织舞会派对

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、问题分析 三、解决方案 1. 利用内置函数创建参会人员名单 2. 利用列表切片…

Redis 事件机制 - AE 抽象层

Redis 服务器是一个事件驱动程序&#xff0c;它主要处理如下两种事件&#xff1a; 文件事件&#xff1a;利用 I/O 复用机制&#xff0c;监听 Socket 等文件描述符上发生的事件。这类事件主要由客户端&#xff08;或其他Redis 服务器&#xff09;发送网络请求触发。时间事件&am…

YashanDB携手慧点科技完成产品兼容认证 助力国产信创生态建设

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB与慧点科技顺利完成兼容性互认证。经严格测试&#xff0c;双方产品完全兼容&#xff0c;稳定运行&#xff0c;共同支撑政府、企业、金融等办公应用场景下的数字化转型升级&#xff0c;为企业的信息技术应用创新提供坚…

【计算机视觉(4)】

基于Python的OpenCV基础入门——色彩空间转换 色彩空间简介HSV色彩空间GRAY色彩空间色彩空间转换 色彩空间转换代码实现: 色彩空间简介 色彩空间是人们为了表示不同频率的光线的色彩而建立的多种色彩模型。常见的色彩空间有RGB、HSV、HIS、YCrCb、YUV、GRAY&#xff0c;其中最…