c# 对象属性拷贝 解决方案

news/2025/2/19 1:53:03/

如果属性值较多,可以用 for 循环操作 例如 将 B对象的属性 赋值给 A对象 操作示例

1. 定义对象

首先,确保你已经定义了AB对象,并且它们有相同的属性。例如:

public class A
{public int Property1 { get; set; }public string Property2 { get; set; }
}public class B
{public int Property1 { get; set; }public string Property2 { get; set; }
}

2. 使用反射进行属性复制

如果你想要通过编程方式自动复制所有匹配的属性,你可以使用反射(Reflection)。以下是一个示例方法,它接受两个对象,并尝试将第二个对象的属性值复制到第一个对象中:

public static void CopyProperties(object source, object destination)
{var sourceType = source.GetType();var destinationType = destination.GetType();var sourceProperties = sourceType.GetProperties();var destinationProperties = destinationType.GetProperties();foreach (var sourceProperty in sourceProperties){var destinationProperty = destinationProperties.FirstOrDefault(p => p.Name == sourceProperty.Name && p.PropertyType == sourceProperty.PropertyType);if (destinationProperty != null){destinationProperty.SetValue(destination, sourceProperty.GetValue(source));}}
}

3. 使用for循环结合反射进行属性复制

如果你想使用for循环来手动处理每个属性(尽管通常反射方法更简洁且易于维护),你可以这样做:

public static void CopyPropertiesWithForLoop(B source, A destination)
{// 获取B类的属性信息数组PropertyInfo[] sourceProperties = typeof(B).GetProperties();// 获取A类的属性信息数组PropertyInfo[] destinationProperties = typeof(A).GetProperties();for (int i = 0; i < sourceProperties.Length; i++){// 查找对应的A类属性PropertyInfo destinationProperty = destinationProperties.FirstOrDefault(p => p.Name == sourceProperties[i].Name && p.PropertyType == sourceProperties[i].PropertyType);if (destinationProperty != null){// 复制属性值destinationProperty.SetValue(destination, sourceProperties[i].GetValue(source));}}
}

4. 使用示例

B b = new B { Property1 = 10, Property2 = "Hello" };
A a = new A();
CopyPropertiesWithForLoop(b, a); // 或者使用反射方法 CopyProperties(b, a);
Console.WriteLine($"A.Property1: {a.Property1}, A.Property2: {a.Property2}"); // 输出: A.Property1: 10, A.Property2: Hello

总结

虽然使用反射可以更灵活地处理不同类型和属性的复制,但对于简单的场景或者当你确定两个对象有完全相同的属性时,使用for循环结合反射也是一种可行的方法。在实际开发中,选择哪种方式取决于你的具体需求和偏好。对于大多数情况,使用反射的方法会更加方便和通用。


http://www.ppmy.cn/news/1572434.html

相关文章

什么是Docker多架构容器镜像

什么是Docker多架构容器镜像 在 Docker 中&#xff0c;同一个 Docker 镜像可以在不同的平台上运行&#xff0c;例如在 x86、ARM、PowerPC 等不同的 CPU 架构上。 为了支持这种多平台的镜像构建和管理&#xff0c;Docker 在 17.06 版本时引入了 Manifest 的概念&#xff0c;在…

降本增效 - VGF 构建轻量高性能日志管理平台

VFG 技术架构 Filebeat 接收Syslog &#xff0c;并进行日志分段&#xff0c;VictoriaLogs 持久化存储日志 &#xff0c;Grafana 可视化、数据查询、告警、数据导出。 为什么要用VictoriaLogs &#xff1f; 与Elasticsearch /Grafana Loki相比几十倍的CPU/内存/存储资源占用的…

Win10环境借助DockerDesktop部署最新MySQL9.2

Win10环境借助DockerDesktop部署最新MySQL9.2 前言 作为一杆主要撸Java的大数据平台开发攻城狮&#xff0c;必不可少要折腾各种组件&#xff0c;环境和版本一直是很头疼的事情。虽然可以借助Anaconda来托管Python的环境&#xff0c;也可以使用多个虚拟机来部署不同的环境&…

HTTP相关面试题

HTTP/1.1、HTTP/2、HTTP/3 演变 HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f; HTTP/1.1 相⽐ HTTP/1.0 性能上的改进&#xff1a; 使⽤长连接的⽅式改善了 HTTP/1.0 短连接造成的性能开销。⽀持管道&#xff08;pipeline&#xff09;网络传输&#xff0c;只要第⼀个请…

车规MCU处理器选择Cortex-M7还是Cortex-R52?

车规mcu处理器选择Cortex-M7还是Cortex-R52&#xff1f;跟随小编从具体应用场景、安全等级&#xff08;ASIL&#xff09;、性能、成本进行分析吧。 01安全等级需求 ASIL-D&#xff08;如刹车、转向&#xff09;→ 必选R52。R52原生支持ASIL-D&#xff0c;硬件级错误检测&#…

【Docker 】虚悬镜像:深入理解与清理实践

文章目录 引言什么是虚悬镜像&#xff1f;虚悬镜像的影响如何识别虚悬镜像清理虚悬镜像1. 使用 docker image prune 命令2. 使用 docker system prune 命令3. 手动删除虚悬镜像 预防虚悬镜像的产生结语 引言 在 Docker 的日常使用中&#xff0c;镜像管理是一个非常重要的环节。…

本地部署【LLM-deepseek】大模型 ollama+deepseek/conda(python)+openwebui/docker+openwebui

通过ollama本地部署deepseek 总共两步 1.模型部署 2.[web页面] 参考官网 ollama:模型部署 https://ollama.com/ open-webui:web页面 https://github.com/open-webui/open-webui 设备参考 Mac M 芯片 windows未知 蒸馏模型版本:deepseek-r1:14b 运行情况macminim2 24256 本地…

uniapp - iconfont下载本地并且运用至项目上

1、项目中创建一个文件夹放置iconfont相关文件&#xff0c;例如src/assets/iconfont&#xff08;名称自己定义&#xff09; 2、在iconfont下载项目至本地 3、解压后把文件复制进1的文件夹中 4、修改src/assets/iconfont - iconfont.css里的font-face的src地址&#xff0c;修…