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

news2024/11/24 1:07:21

在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。通过合理选择工具库,可以大大简化对象属性复制的代码,提高开发效率。

在这里插入图片描述

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

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

相关文章

Html基础笔记

Html超文本标记语言 (HyperText Markup Language) 超文本 指的是网页中可以显示的内容(图片,超链接,视频,) 标记语言 标记–>标签(标注) 例如:买东西的时候—>商品具有标签,看到标签就知道商品的属性(价格,材质,型号等,) 标记语言就是提供了很多的标签,不同的标签…

Android 几个简单的自定义对话框介绍

Android 几个简单的自定义对话框介绍 文章目录 一、前言二、对话框相关内容1、效果2、对话框显示的调用代码&#xff08;1&#xff09;原生对话框代码&#xff1a;&#xff08;2&#xff09;自定义对话框代码&#xff1a; 3、对话框SweetAlertDialog 主要实现代码&#xff1a;4…

在DAYU200上实现OpenHarmony跳转拨号界面

一、简介 日常生活中&#xff0c;打电话是最常见的交流方式之一&#xff0c;那么如何在OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;中进行电话服务相关的开发呢&#xff1f;今天我们可以一起来了解一下如何通过电话服务系统支持的API实现拨打电话的功能…

噱头还是风口?剖析AI短剧出海的未来

导语 |去年以来&#xff0c;低成本、高回报的土味短剧在国内爆火&#xff0c;而这股风也成功地刮到海外。2024 年&#xff0c;越来越多的人把目光投向了拥有庞大市场的国外“蓝海”&#xff0c;当人们还在高谈阔论 Sora 是否颠覆影视行业的时候&#xff0c;AI 已经在出海短剧中…

Linux系统搭建Tale个人博客网站并实现无公网IP访问本地博客

文章目录 前言1. Tale网站搭建1.1 检查本地环境1.2 部署Tale个人博客系统1.3 启动Tale服务1.4 访问博客地址 2. Linux安装Cpolar内网穿透3. 创建Tale博客公网地址4. 使用公网地址访问Tale 前言 今天给大家带来一款基于 Java 语言的轻量级博客开源项目——Tale&#xff0c;Tale…

【嵌入式芯片开发】不使用MicroLib的串口重定向万能预编译配置(适用于ARMCC、AC6等不同的编译器及版本)

【嵌入式芯片开发】不使用MicroLib的串口重定向万能预编译配置&#xff08;适用于ARMCC、AC6等不同的编译器及版本&#xff09; 文章目录 基本的串口重定向接收中断与scanf不能同时工作重定向卡死、低功耗一直唤醒 串口重定向万能预编译配置附录&#xff1a;Cortex-M架构的Sys…

【设计模式深度剖析】【5】【创建型】【原型模式】| 类比群发邮件,加深理解

&#x1f448;️上一篇:建造者模式 | 下一篇:创建型设计模式对比&#x1f449;️ 目录 原型模式(Prototype Pattern)概览定义英文原话直译 3个角色类图1. 抽象原型&#xff08;Prototype&#xff09;角色2. 具体原型&#xff08;Concrete Prototype&#xff09;角色3. 客户…

【cocos creator 】生成六边形地图

想要生成一个六边形组成的地图 完整代码示例 以下是完整的代码示例&#xff0c;包含了注释来解释每一步&#xff1a; cc.Class({extends: cc.Component,properties: {hexPrefab: {default: null,type: cc.Prefab},mapWidth: 10, // 网格的宽度&#xff08;六边形的数量&am…

基于Pytorch框架全连接神经网络对手势图片识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手势识别是计算机视觉领域的一个重要研究方向&#xff0c;具有广泛的应用前景&#xff0c;如人…

react中怎么为props设置默认值

在React中&#xff0c;你可以使用ES6的类属性&#xff08;class properties&#xff09;或者函数组件中的默认参数&#xff08;default parameters&#xff09;来定义props的默认值。 1.类组件中定义默认props 对于类组件&#xff0c;你可以在组件内部使用defaultProps属性来…

基于Java的推箱子游戏设计与实现(论文 + 源码)

【免费】关于基于JAVA的推箱子游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89325018 基于Java的推箱子游戏设计与实现 摘 要 社会在进步&#xff0c;人们生活质量也在日益提高。高强度的压力也接踵而来。社会中急需出现新的有效方式来缓解人们的压力。…

Java开发大厂面试第20讲:什么是分布式锁?Redi 怎样实现的分布式锁?

“锁”是我们实际工作和面试中无法避开的话题之一&#xff0c;正确使用锁可以保证高并发环境下程序的正确执行&#xff0c;也就是说只有使用锁才能保证多人同时访问时程序不会出现问题。 我们本课时的面试题是&#xff0c;什么是分布式锁&#xff1f;如何实现分布式锁&#xf…

秋招突击——算法打卡——5/24——无重复字符的最长字串

题目描述 实现代码 // 无重复字符的最长子串 int lengthOfLongestSubstring(string s) {int l 0,r 0;int res 0;unordered_map<char,int> temp;while(l < s.size()){temp[s.at(l)] l;for (r l 1; r < s.size() ; r) {if(temp.count(s.at(r))) break;else te…

Python UDP编程简单实例

TCP是建立可靠的连接&#xff0c;并且通信双方都可以以流的形式发送数据。 相对于TCP&#xff0c;UDP则是面向无连接的协议&#xff0c;不需要建立连接&#xff0c;只需要知道对方IP地址和端口号&#xff0c;就可以直接发送数据包。但是只管发送不保证到达。 虽然UDP传输数据…

详解 UML 中的关系概念

关联&#xff08;Association&#xff09; 表示两个类之间的一种语义性联系。例如: 学生与班级之间的关联关系。 有向关联&#xff08;Directed Association&#xff09; 关联关系有方向性,表示一个类能访问另一个类,但不一定反过来。例如: 教师能查看学生的成绩,但学生不能查…

三能一体运营体系助力政企支撑水平提升

生产力的发展是现代社会孜孜不倦的追求&#xff0c;由此产生了我们熟悉的“机械化、电子化、信息化”乃至现今正在发生的“智能化”四次工业革命。这些是由技术的突破性发展带来的&#xff0c;但我们也注意到生产力发展的另一个助力&#xff0c;即生产效率的提升&#xff0c;19…

PE文件(六)新增节-添加代码作业

一.手动新增节添加代码 1.当预备条件都满足&#xff0c;节表结尾没有相关数据时&#xff1a; 现在我们将ipmsg.exe用winhex打开&#xff0c;在节的最后新增一个节用于存放我们要增加的数据 注意&#xff1a;飞鸽的文件对齐和内存对齐是一致的 先判断节表末尾到第一个节之间…

系统架构师-考试-基础题-错题集锦1

系统架构师-考试-基础题-错题集锦 1.当一台服务器出现故障时将业务迁移到另外一台物理服务器上&#xff0c;保障了业务的连续性。 2.面向对象&#xff1a; 实体类&#xff0c;边界类&#xff0c;控制类 3.RUP&#xff1a;UP&#xff0c;统一过程&#xff0c;以架构为中心&am…

养鸡游戏牧场游戏已对接广告联盟功能介绍

养鸡游戏牧场游戏在对接广告联盟后&#xff0c;主要实现了以下几个功能&#xff1a; 广告展示与收益&#xff1a; 游戏内会嵌入广告联盟的广告&#xff0c;这些广告可能会以横幅、插屏、视频等多种形式出现在游戏的各个界面&#xff0c;如主界面、场景切换、任务完成等时机。广…

【深度学习02】注意力机制

1.自注意力机制 自注意力机制&#xff08;Self-Attention Mechanism&#xff09;是深度学习中的一种方法&#xff0c;广泛应用于自然语言处理和其他领域。为了更好地理解它&#xff0c;可以用一个简单的类比来解释。 类比&#xff1a;学生在课堂上做笔记 假设你是一个学生&a…