C#中实现两个对象部分相同属性值的复制

article/2025/6/25 13:06:20

在C#中实现两个对象部分相同属性值的复制,可通过以下方案实现:

一、手动赋值(基础方案)

直接通过属性名逐个赋值,适用于属性较少且明确的情况:

// 示例类定义
public class Source
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Target
{
    public int Id { get; set; }
    public string Name { get; set; }
}

// 手动赋值
var source = new Source { Id = 1, Name = "Test" };
var target = new Target 
{
    Id = source.Id,
    Name = source.Name
};

特点:性能最优但代码冗余。


二、反射实现(通用方案)

通过反射动态匹配同名属性,适用于属性较多或动态场景:

public static void CopyProperties(object source, object target)
{
    var sourceType = source.GetType();
    var targetType = target.GetType();
    foreach (var prop in sourceType.GetProperties())
    {
        var targetProp = targetType.GetProperty(prop.Name);
        if (targetProp != null && targetProp.PropertyType == prop.PropertyType)
        {
            targetProp.SetValue(target, prop.GetValue(source));
        }
    }
}

// 调用示例
CopyProperties(source, target);

注意事项:

1、需处理属性类型是否兼容(如可空类型)。
2、反射性能较低,频繁调用需谨慎。


三、使用 AutoMapper(第三方库)

通过 AutoMapper 库简化映射逻辑:

// 安装 NuGet 包:Install-Package AutoMapper
var config = new MapperConfiguration(cfg => 
    cfg.CreateMap<Source, Target>()
        // 可选:忽略特定属性
        .ForMember(dest => dest.IgnoreProp, opt => opt.Ignore())
);
var mapper = config.CreateMapper();
Target target = mapper.Map<Target>(source);

优点:代码简洁,支持复杂映射配置。


四、表达式树实现(高性能方案)

通过预编译表达式树提升性能,适合高频调用场景:

public static class FastCopy
{
    private static Dictionary<string, Action<object, object>> _cache = new();

    public static void Copy(object source, object target)
    {
        var key = $"{source.GetType().FullName}_{target.GetType().FullName}";
        if (!_cache.TryGetValue(key, out var copyAction))
        {
            copyAction = BuildCopyAction(source.GetType(), target.GetType());
            _cache[key] = copyAction;
        }
        copyAction(source, target);
    }

    private static Action<object, object> BuildCopyAction(Type sourceType, Type targetType)
    {
        // 构建表达式树(略,详见引用[7])
        // 返回编译后的委托
    }
}

特点:接近原生代码性能,但实现复杂度较高。

方案对比

方法                        性能            编码复杂度            适用场景
手动赋值                 最高                低                    少量固定属性
反射                        低                   中                    动态属性匹配
AutoMapper            中                   低                需要灵活配置或复杂映射
表达式树                 高                   高                高频调用且追求性能优化

推荐选择:

简单场景优先手动赋值或 AutoMapper。
高频调用场景建议采用表达式树预编译方案。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 


http://www.hkcw.cn/article/eIusXmqFmS.shtml

相关文章

SOC-ESP32S3部分:22-分区表

飞书文档https://x509p6c8to.feishu.cn/wiki/F9PdwnOKhiTRDWk4cr1cIZsvneh 无论是前面我们说到的NVS&#xff0c;还是后面用到的文件系统&#xff0c;他们都必须有存储的载体&#xff0c;例如NVS&#xff0c;我们说过它是存储在Flash中的&#xff0c;那具体是Flash的哪个位置呢…

华为OD机试真题——找出两个整数数组中同时出现的整数(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《找出两个整数数组中同时出…

KWIC—Implicit Invocation

KWIC—Implicit Invocation ✏️ KWIC—Implicit Invocation 文章目录 KWIC—Implicit Invocation&#x1f4dd;KWIC—Implicit Invocation&#x1f9e9;KWIC&#x1f9e9;核心组件&#x1f9e9;ImplementationScheme⚖️ 隐式调用 vs 显式调用对比 &#x1f31f; 总结 &#x…

JWT 入门

一、JWT 概述 1. 扩展(Cookie、Session、Token) 灵魂拷问&#xff1a;为什么你的淘宝账号关闭后&#xff0c;购物车还在&#xff1f;其实这是Cookie 在搞事情。它就像是一种入场券&#xff0c;有该入场券就可以随意进出关卡。但这有个致命的弱点&#xff0c;Cookie是存在客户…

传统液晶瓶颈待破?铁电液晶如何实现显示技术逆袭

一、传统液晶显示&#xff1a;繁华背后的技术枷锁 在消费电子与专业显示领域&#xff0c;液晶技术&#xff08;LCD&#xff09;凭借成熟的产业链和性价比优势&#xff0c;长期占据主流地位。然而&#xff0c;随着 VR/AR、车载显示、高端投影等新兴场景的崛起&#xff0c;传统液…

Mybatis:灵活掌控SQL艺术

在前面的文章中&#xff0c;小编分享了spring中相关的知识&#xff0c;但是没有分享到&#xff0c;如何去更高效操作数据库。 操作数据库传统的方法就是通过JDBC来进行操作。 这个传统方法使用上可谓是够麻烦的 1.首先创建一个数据源对象 2.设置该数据源的属性&#xff08;…

STM32CubeMX定时器配置

STM32CubeMX定时器配置 一&#xff0c;Mode界面1&#xff0c;Slave Mode (从模式)2&#xff0c;Trigger Source (触发源) 三&#xff0c;Channelx&#xff08;通道模式&#xff09;1&#xff0c;Input Capture2&#xff0c;Output Compare3&#xff0c;PWM Generation4&#xf…

可灵2.1 vs Veo 3:AI视频生成谁更胜一筹?

在Google发布Veo 3几天后,可灵显然感受到了压力,发布了即将推出的视频模型系列可灵 2.1的早期体验版。 据我了解,有三种不同的模式: 可灵 2.1 标准模式: 720p分辨率 仅支持图像转视频(生成更快,一致性更好) 5秒视频仍需20积分 可灵 2.1 专业模式: 1080p分辨率 仅在图…

推荐几个不错的AI入门学习视频

引言&#xff1a;昨天推荐了几本AI入门书&#xff08;AI入门书&#xff09;&#xff0c;反响还不错。今天&#xff0c;我再推荐几个不错的AI学习视频&#xff0c;希望对大家有帮助。 网上关于AI的学习视频特别多。有收费的&#xff0c;也有免费的。我今天只推荐免费的。 我们按…

【机器学习】支持向量机

文章目录 一、支持向量机简述1.概念2.基本概念3.算法介绍4.线性可分5.算法流程 二、实验1.代码介绍2.模型流程3.实验结果4.实验小结 一、支持向量机简述 1.概念 支持向量机&#xff08;SVM&#xff09;是一类按监督学习方式对数据进行二元分类的广义线性分类器&#xff0c;其…

scale up 不能优化 TCP 聚合性能

scale up 作为一种系统扩展优化的方法&#xff0c;旨在提高系统组件的执行效率&#xff0c;比如替换更高性能的硬件或算法。是否可以此为依据优化 TCP 呢&#xff0c;例如通过多条路径聚合带宽实现吞吐优化(对&#xff0c;还是那个 MPTCP)&#xff0c;答案是否定的。 因为 TCP…

深度学习|pytorch基本运算-广播失效

【1】引言 前序文章中&#xff0c;已经学习了pytorch基本运算中的生成随机张量、生成多维张量&#xff0c;以及张量的变形、加减和广播运算。 今天的文章在之前学习的基础上&#xff0c;进一步探索。 前序文章链接为&#xff1a; 深度学习|pytorch基本运算-CSDN博客 【2】…

Asp.Net Core SignalR的分布式部署

文章目录 前言一、核心二、解决方案架构三、实现方案1.使用 Azure SignalR Service2.Redis Backplane(Redis 背板方案&#xff09;3.负载均衡配置粘性会话要求无粘性会话方案&#xff08;仅WebSockets&#xff09;完整部署示例&#xff08;Redis Docker&#xff09;性能优化技…

Linux环境搭建MCU开发环境

操作系统版本&#xff1a; ubuntu 22.04 文本编辑器&#xff1a; vscode 开发板&#xff1a; stm32f103c8t6 调试器&#xff1a; st-link 前言 步骤一&#xff1a; 安装交叉编译工具链 步骤二&#xff1a; 创建工程目录结构 步骤三&#xff1a; 调试…

VR/AR 视网膜级显示破局:10000PPI 如何终结颗粒感时代?

一、传统液晶 “纱窗效应”&#xff1a;VR 沉浸体验的最大绊脚石 当用户首次戴上 VR 头显时&#xff0c;眼前密密麻麻的像素网格往往打破沉浸感 —— 这正是传统液晶显示在近眼场景下的致命缺陷。受限于 500-600PPI 的像素密度&#xff0c;即使达到 4K 分辨率&#xff0c;等效到…

【教学类-36-10】20250531蝴蝶图案描边,最适合大小(一页1图1图、2图图案不同、2图图案相同对称)

背景说明: 之前做了动物头像扇子(描边20),并制作成一页一套图案对称两张 【教学类-36-09】20250526动物头像扇子的描边(通义万相)对称图40张,根据图片长宽,自动旋转图片,最大化图片-CSDN博客文章浏览阅读1k次,点赞37次,收藏6次。【教学类-36-09】20250526动物头像…

灌水论坛系统总体设计文档

一、实验题目 灌水论坛系统 二、实验目的 旨在通过一个相对完整且功能丰富的Web应用实例&#xff0c;全面地实践和巩固Web开发所需的各项核心技术和工程方法&#xff0c;从而提升其综合应用能力和解决实际开发问题的能力。它不仅仅是完成一个软件&#xff0c;更是一个学习、…

TK海外抢单源码/指定卡单

​ 抢单源码&#xff0c;有指定派单&#xff0c;打针&#xff0c;这套二改过充值跳转客服 前端vue 后端php 两端分离 可二开 可以指定卡第几单&#xff0c;金额多少&#xff0c; 前后端开源 PHP7.2 MySQL5.6 前端要www.域名&#xff0c;后端要admin.域名 前端直接静态 伪静…

印军高官为何指责83架光辉订单0交付 国产战机交付延迟

印度空军参谋长辛格在印度工业联合会举办的年度商业峰会上严厉批评本国的航空制造业,指出印度大型国防项目的落实没有如期进行,包括国产“光辉”战机在内的战斗机向空军交付均出现延迟。根据2021年与印度斯坦航空有限公司签订的价值4800亿卢比(约合404亿元人民币)的合同,印…

年轻人开始主动挂艾草了 老习俗焕发新活力

今年端午节当天,“年轻人开始主动挂艾草了”登上小红书APP热点榜首,截至晚上9点30分浏览量达到918万次。菜市场几块钱一把的野生艾草,在年轻人手中经过巧手改造,搭配菖蒲叶、玉簪叶、香樟果和铃铛,变成了身价百元的“祈福门挂”。如今,挂艾草不再只是简单的节庆习俗,而是…