当前位置: 首页 > news >正文

C#编程-.NET Framework使用工具类简化对象之间的属性复制和操作

在C#编程中,对象之间的属性复制和操作是一个常见的需求。为此,.NET Framework提供了多种实用工具库,如AutoMapper、ValueInjecter和ExpressMapper。这些库通过简化代码,提高了开发效率。本文将介绍这些工具库,比较它们的特点,提供使用示例,并总结它们的优缺点,帮助开发者选择合适的工具库。

在这里插入图片描述

一、适用于属性复制的实用工具库

1、工具库列举

在.NET Framework中,有几个常用的工具库可以用于简化对象之间的属性复制和操作。以下是一些常用的库:

工具库名称支持的.NET版本安装方式特点
AutoMapper.NET Framework 4.x, .NET Core, .NET StandardInstall-Package AutoMapper功能强大,社区支持广泛,配置灵活
ValueInjecter.NET Framework 4.x, .NET Core, .NET StandardInstall-Package Omu.ValueInjecter轻量级,简单易用
ExpressMapper.NET Framework 4.x, .NET Core, .NET StandardInstall-Package ExpressMapper高效快速,代码简洁

2、工具库对比

下面是对这些工具库的详细对比:

特性/工具库AutoMapperValueInjecterExpressMapper
安装复杂度中等简单简单
学习曲线中等
配置灵活性中等
性能中等
社区支持广泛一般一般
自定义映射支持支持支持
深度克隆支持支持不支持

二、各工具库使用代码示例

1、AutoMapper

AutoMapper 是一个功能强大的对象映射库,广泛用于企业项目中。下面是一些常用功能的代码示例。

安装

Install-Package AutoMapper

使用示例

① 基本映射
using AutoMapper;public class Source
{public string Name { get; set; }public int Age { get; set; }
}public class Destination
{public string Name { get; set; }public int Age { get; set; }
}public class Program
{public static void Main(){var config = new MapperConfiguration(cfg => cfg.CreateMap<Source, Destination>());var mapper = config.CreateMapper();var source = new Source { Name = "Alice", Age = 30 };var destination = mapper.Map<Destination>(source);Console.WriteLine($"Name: {destination.Name}, Age: {destination.Age}");}
}
② 自定义映射
using AutoMapper;public class Source
{public string FirstName { get; set; }public string LastName { get; set; }
}public class Destination
{public string FullName { get; set; }
}public class Program
{public static void Main(){var config = new MapperConfiguration(cfg => {cfg.CreateMap<Source, Destination>().ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.FirstName + " " + src.LastName));});var mapper = config.CreateMapper();var source = new Source { FirstName = "John", LastName = "Doe" };var destination = mapper.Map<Destination>(source);Console.WriteLine($"FullName: {destination.FullName}");}
}

2、ValueInjecter

ValueInjecter 是一个轻量级的对象映射库,适用于简单的属性复制场景。

安装

Install-Package Omu.ValueInjecter

使用示例

① 基本映射
using Omu.ValueInjecter;public class Source
{public string Name { get; set; }public int Age { get; set; }
}public class Destination
{public string Name { get; set; }public int Age { get; set; }
}public class Program
{public static void Main(){var source = new Source { Name = "Alice", Age = 30 };var destination = new Destination();destination.InjectFrom(source);Console.WriteLine($"Name: {destination.Name}, Age: {destination.Age}");}
}
② 自定义映射
using Omu.ValueInjecter;public class Source
{public string FirstName { get; set; }public string LastName { get; set; }
}public class Destination
{public string FullName { get; set; }
}public class CustomInjection : ConventionInjection
{protected override bool Match(ConventionInfo c){return c.SourceProp.Name == "FirstName" && c.TargetProp.Name == "FullName";}protected override object SetValue(ConventionInfo c){return ((string)c.SourceProp.Value) + " " + ((Source)c.Source).LastName;}
}public class Program
{public static void Main(){var source = new Source { FirstName = "John", LastName = "Doe" };var destination = new Destination();destination.InjectFrom<CustomInjection>(source);Console.WriteLine($"FullName: {destination.FullName}");}
}

3、ExpressMapper

ExpressMapper 是一个高效的对象映射库,适用于需要高性能映射的场景。

安装

Install-Package ExpressMapper

使用示例

① 基本映射
using ExpressMapper;public class Source
{public string Name { get; set; }public int Age { get; set; }
}public class Destination
{public string Name { get; set; }public int Age { get; set; }
}public class Program
{public static void Main(){Mapper.Register<Source, Destination>();Mapper.Compile();var source = new Source { Name = "Alice", Age = 30 };var destination = Mapper.Map<Source, Destination>(source);Console.WriteLine($"Name: {destination.Name}, Age: {destination.Age}");}
}
② 自定义映射
using ExpressMapper;public class Source
{public string FirstName { get; set; }public string LastName { get; set; }
}public class Destination
{public string FullName { get; set; }
}public class Program
{public static void Main(){Mapper.Register<Source, Destination>().Member(dest => dest.FullName, src => src.FirstName + " " + src.LastName);Mapper.Compile();var source = new Source { FirstName = "John", LastName = "Doe" };var destination = Mapper.Map<Source, Destination>(source);Console.WriteLine($"FullName: {destination.FullName}");}
}

三、适用于属性复制的工具库优缺点对比

以下是 AutoMapper、ValueInjecter 和 ExpressMapper 的优缺点对比:

工具库名称优点缺点
AutoMapper功能强大,支持复杂的映射场景
配置灵活,支持自定义映射
社区支持广泛,文档丰富
学习曲线较陡,需要时间熟悉配置
在一些简单场景中可能显得过于复杂
ValueInjecter轻量级,使用简单
适用于简单的属性复制场景
功能相对有限,支持复杂映射的能力不强
社区支持和文档较少
ExpressMapper高效快速,性能优异
代码简洁,易于使用
功能相对较少,支持的映射场景有限
社区支持和文档较少
  • AutoMapper 是一个功能强大且配置灵活的工具,适合处理复杂的映射场景,但学习曲线较陡,适合需要高级映射功能的项目。
  • ValueInjecter 是一个轻量级、易于使用的工具,适合处理简单的属性复制场景,但功能有限,适合需要简单映射的项目。
  • ExpressMapper 是一个高效快速的工具,性能优异,适合对性能有较高要求的项目,但功能较少,适合需要简单高效映射的项目。

四、适用于属性复制的实用工具库总结

在选择适用于属性复制的工具库时,需要根据项目的具体需求进行选择。如果需要处理复杂的映射场景,推荐使用AutoMapper;如果仅需要处理简单的属性复制,可以选择ValueInjecter;如果对性能有较高要求,可以选择ExpressMapper。通过合理选择工具库,可以大大简化对象属性复制的代码,提高开发效率。

在这里插入图片描述

相关文章:

C#编程-.NET Framework使用工具类简化对象之间的属性复制和操作

在C#编程中&#xff0c;对象之间的属性复制和操作是一个常见的需求。为此&#xff0c;.NET Framework提供了多种实用工具库&#xff0c;如AutoMapper、ValueInjecter和ExpressMapper。这些库通过简化代码&#xff0c;提高了开发效率。本文将介绍这些工具库&#xff0c;比较它们…...

爬虫基本原理及requests库用法

文章目录 一、爬虫基本原理1、什么是爬虫2、爬虫的分类3、网址的构成4、爬虫的基本步骤5、动态【异步】页面和静态【同步】页面6、请求头 二、requests基本原理及使用1、chrome 抓包按钮详解1.1 Elements1.2 元素定位器1.3 Network1.4 All1.5 XHR1.6 Preserve log1.7 手机模式1…...

spring和springboot、springcloud版本关系

进入新公司&#xff0c;看底层框架代码时&#xff0c;想了解spring的版本&#xff0c;很好奇这些版本之间时怎么对应的&#xff0c;因为不同版本应该有依赖关系&#xff0c;用得不对可能代码会有隐藏问题。 Spring、SpringBoot和SpringCloud的版本不一致&#xff0c;并且需要搭…...

视频监控汇聚平台LntonCVS通过GB/T28181国标协议实现视频监控平台的级联方案

近年来&#xff0c;随着网络视频监控应用范围的拓展&#xff0c;越来越多的政府部门和跨区域行业单位对视频监控的需求已经不局限于本地联网监控。他们正在探索在原有的本地联网监控基础上&#xff0c;建设省级乃至全国范围内的跨区域监控联网&#xff0c;以全面打造数据共享平…...

【精品】使用 v-md-editor 上传图片

简介 v-md-editor 是基于 Vue 开发的 markdown 编辑器组件&#xff0c;即支持vue2也支持vue3。 gitee&#xff1a;https://gitee.com/ckang1229/vue-markdown-editor文档&#xff1a;https://code-farmer-i.github.io/vue-markdown-editor/zh/ 服务器端代码 RestController…...

STM32——DAC篇(基于f103)

技术笔记&#xff01; 一、DAC简介&#xff08;了解&#xff09; 1.1 DAC概念 传感器信号采集改变电信号&#xff0c;通过ADC转换成单片机可以处理的数字信号&#xff0c;处理后&#xff0c;通过DAC转换成电信号&#xff0c;进而实现对系统的控制。 1.2 DAC的特性参数 1.3…...

突然提示由于找不到msvcr120.dll,无法继续执行代码有什么办法可以解决?

msvcr120.dll是Microsoft Visual C 2013 Redistributable Package的一部分&#xff0c;它包含了运行时库&#xff0c;用于支持使用Visual C 2013开发的应用程序。如果电脑突然提示由于找不到msvcr120.dll,无法继续执行代码有什么办法可以解决&#xff1f;以下是关于msvcr120.dl…...

swig4.2.1压缩包中里面没有找到swig.exe

官网&#xff1a;Simplified Wrapper and Interface Generator C转 C# 采用Swig.exe 打开Example示例的解决方案&#xff1a;sln 生成 即可查看如何调用和使用.i文件 但是&#xff1a;迅雷不管下载哪个版本都是没有exe 官网说了自带。很迷很迷~ 下载其他版本的时候发现&…...

Vue文本溢出如何自动换行

css新增 word-break: break-all; word-wrap: break-word;...

【系统架构师】-论文-系统安全性与保密性设计

1、摘要: 2018 年初&#xff0c;我所在的公司为一票务公司开发开票业务平台的建设。我在该项目中担任系统架构设计师的职务&#xff0c;主要负责设计平台系统架构和安全体系架构。该平台以采用 B/S 架构服务用户&#xff0c;采用”平台应用”的模式解决现有应用单机独立开票的模…...

Cisco Catalyst 9000 9200 9300 9400 IOS software upgrade

1 背景 从Catalyst 3650 ,3850&#xff0c;Catalyst 9000开始, 更准确的说是IOS XE的交换机的系统镜像安装方式分为2种  Bundle mode  Install mode 这2种方工啥区别&#xff1f; Bundle mode 传统方式利用boot system flash:c9k.xx16.bin方式引导 Install mode 将bin文…...

Web Server项目实战2-Linux上的五种IO模型

上一节内容的补充&#xff1a;I/O多路复用是同步的&#xff0c;只有调用某些API才是异步的 Unix/Linux上的五种IO模型 a.阻塞 blocking 调用者调用了某个函数&#xff0c;等待这个函数返回&#xff0c;期间什么也不做&#xff0c;不停地去检查这个函数有没有返回&#xff0c…...

Docker | 基础指令

环境&#xff1a;centos8 参考&#xff1a; 安装 Docker | Docker 从入门到实践https://vuepress.mirror.docker-practice.com/install/ 安装Docker 卸载旧版本&#xff0c;安装依赖包&#xff0c;添加yum软件源&#xff0c;更新 yum 软件源缓存&#xff0c;安装 docker-ce…...

10款手机黑科技app,每款都好用到爆!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 1. 计划程序应用 —— Android Auto Text Android Auto Text&#xff08;前身为 Do It Later&#xff09;是一款简单易用的日程安排应用程序&am…...

tomcat请求数据解析过程

前面提到tomcat请求处理的io交互过程&#xff0c;现在开始看下经过io交互后tomcat是怎么处理请求数据的。首先到AbstractProtocol.java中的process方法&#xff0c;注意这个方法是在tomcat线程池分配的线程调用的。生成用来对请求字节流数据进行解析的Http11Processor。 public…...

《扑克牌游戏》

描述 有一个扑克牌游戏&#xff0c;游戏规则是不断地摸牌&#xff0c;尽可能地使手上的牌的点数接近于10&#xff0c;最完美的情况是总点数为10&#xff0c;不可以超过10&#xff0c;否则就爆了。输入10张牌的点数&#xff0c;(每张点数不超过10)&#xff0c;请你输出用户应该抓…...

kali模块及字典介绍

1. 基本模块介绍 模块 类型 使用模式 功能 dmitry 信息收集 命令行 whois查询/子域名收集/端口扫描 dnmap 信息收集 命令行 用于组建分布式nmap&#xff0c;dnmap_server为服务端;dnmap_client为客户端 i…...

交换排序、归并排序、计数排序

冒泡排序&#xff1a; void BubbleSort(int* a, int n) {//第一层循环是趟数&#xff0c;第二层是交换for (int i 0; i < n-2; i){int flag 0;for (int j 0; j < n - 2 - i; j){if (a[j] > a[j 1]){swap(&a[j], &a[j 1]);flag 1;}}if (flag 0){break;…...

怎么查看 iOS ipa包 mobileprovision 改动

查看 iOS .ipa 包中的 .mobileprovision 文件&#xff08;即配置文件或描述文件&#xff09;的改动&#xff0c;可以通过以下步骤进行&#xff1a; 重命名 .ipa 文件&#xff1a;将 .ipa 文件扩展名改为 .zip。例如&#xff0c;如果文件名为 MyApp.ipa&#xff0c;则重命名为 M…...

【Unitydemo制作】音游制作—控制器与特效

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…...

终极指南:10个技巧快速解决iOS符号拦截失败问题

终极指南&#xff1a;10个技巧快速解决iOS符号拦截失败问题 【免费下载链接】fishhook A library that enables dynamically rebinding symbols in Mach-O binaries running on iOS. 项目地址: https://gitcode.com/gh_mirrors/fi/fishhook 如果你在使用fishhook进行iOS…...

Pixel Dream Workshop应用场景:像素游戏测试用占位图(placeholder)批量生成

Pixel Dream Workshop应用场景&#xff1a;像素游戏测试用占位图批量生成 1. 像素游戏开发中的占位图挑战 在独立游戏开发过程中&#xff0c;美术资源往往是开发进度的瓶颈之一。特别是对于像素风格的游戏项目&#xff0c;开发者经常面临一个两难选择&#xff1a; 等待专业美…...

双臂机器人piper_ros

1.piper gazebo仿真启动gazebo终端1&#xff1a;cd piper_ros source devel/setup.bash roslaunch piper_gazebo piper_gazebo.launch #有夹爪roslaunch piper_gazebo piper_no_gripper_gazebo.launch #无夹爪启动rviz终端2&#xff1a;cd ~/piper_ros source devel/setup.bash…...

全国霸王餐 API 接口聚合平台,Java 后端多数据源路由策略设计

全国霸王餐 API 接口聚合平台&#xff0c;Java 后端多数据源路由策略设计 在构建全国性的霸王餐&#xff08;Free Meal&#xff09;与外卖CPS聚合平台时&#xff0c;单一的数据源架构往往无法支撑海量的并发请求与复杂的业务隔离需求。随着业务规模的扩张&#xff0c;系统通常面…...

Git-RSCLIP多模态检索实战:输入‘干旱期农田龟裂纹理’召回匹配影像

Git-RSCLIP多模态检索实战&#xff1a;输入干旱期农田龟裂纹理召回匹配影像 1. 引言&#xff1a;当遥感图像遇上智能检索 想象一下这样的场景&#xff1a;你手头有成千上万张遥感图像&#xff0c;需要快速找到那些显示"干旱期农田龟裂纹理"的图片。传统方法可能需要…...

memtest_vulkan显存检测终极指南:从问题识别到健康管理

memtest_vulkan显存检测终极指南&#xff1a;从问题识别到健康管理 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 一、显存故障问题识别&#xff1a;图形渲染异…...

山东大学2022-2023学期实时绘制期末考试真题(回忆版)

山东大学2022年到2023年实时绘制期末考试 &#xff08;一共9到小题&#xff0c;每题10分或12分&#xff0c;包含多个小问&#xff0c;上午考完下午回忆写的&#xff0c;大体就这些&#xff0c;复习时还是应该全面一点。&#xff09; AABB包围盒构建过程&#xff1b;中间节点和叶…...

一文了解光储设计一体化系统

在“双碳”战略与新型电力系统建设的双重驱动下&#xff0c;光储融合已成为新能源领域的核心发展方向。传统光储项目常面临光伏与储能设计割裂、容量配置失准、收益难以预判等痛点&#xff0c;而光储设计一体化系统正是解决这些行业难题的核心工具。它以数字化、智能化技术为核…...

跨境多币种支付系统的实现

随着全球化贸易与数字经济深度融合&#xff0c;跨境多币种支付已成为跨境电商、外贸 B2B、SaaS 出海、国际文旅等场景的核心基础设施。一套稳定、合规、低成本的多币种支付系统&#xff0c;既要解决多币种兑换、跨境清算、汇率波动等技术难题&#xff0c;也要满足全球范围内反洗…...

Notepad-- 终极中文编辑器:从零开始打造你的专属高效文本工作流

Notepad-- 终极中文编辑器&#xff1a;从零开始打造你的专属高效文本工作流 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器&#xff0c;目标是做中国人自己的编辑器&#xff0c;来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- …...