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

C#高级:利用反射进行同名字段的映射(类似于AutoMap)

转移相同字段的数据信息

【需求】有两个列表A和B,调用方法后,A字段和B字段属性名字相同的数据,能相互传输(相当于EF的Map方法)。

【代码】

using System;
using System.Collections.Generic;
using System.Reflection;public class EntityA
{public int Id { get; set; }         // 实体A的ID属性public string Name { get; set; }    // 实体A的Name属性public int Score { get; set; }      // 实体A的Score属性public string AA { get; set; }      // 实体A的AA属性
}public class EntityB
{public int Id { get; set; }         // 实体B的ID属性public string Name { get; set; }    // 实体B的Name属性public int BB { get; set; }         // 实体B的BB属性
}public class Program
{public static void Main(){// 创建两个实体列表List<EntityA> listA = new List<EntityA>{new EntityA { Id = 1, Name = "Alice", Score = 85, AA = "I like milk" },   // 初始化实体A列表new EntityA { Id = 2, Name = "Bob", Score = 72, AA = "I like apple" }};List<EntityB> listB = new List<EntityB>(); // 目标列表// 调用传输方法,将实体A列表转换为实体B列表TransferProperties(listA, listB);// 打印传输后的结果Console.WriteLine("List B after transfer:");foreach (var entity in listB){Console.WriteLine($"Id: {entity.Id}, Name: {entity.Name}, BB: {entity.BB}");}}// 泛型方法,将实体A列表转换为实体B列表public static void TransferProperties<T, U>(List<T> listA, List<U> listB){foreach (var source in listA){// 创建目标对象U的实例U destination = Activator.CreateInstance<U>();// 将目标对象添加到目标列表listB.Add(destination);// 调用属性传输方法,将实体A的属性值复制到实体B中对应的属性TransferProperties(source, destination);}}// 泛型方法,将实体A的属性值复制到实体B中对应的属性public static void TransferProperties<T, U>(T source, U destination){var sourceProperties = typeof(T).GetProperties();      // 获取实体A的所有属性var destinationProperties = typeof(U).GetProperties(); // 获取实体B的所有属性foreach (var sourceProperty in sourceProperties){foreach (var destinationProperty in destinationProperties){// 如果属性名称和类型匹配,并且目标属性可写,则复制属性值if (sourceProperty.Name == destinationProperty.Name &&sourceProperty.PropertyType == destinationProperty.PropertyType &&destinationProperty.CanWrite){var value = sourceProperty.GetValue(source);    // 获取源属性的值destinationProperty.SetValue(destination, value); // 设置目标属性的值break; // 属性名称匹配,不再继续内循环}}}}
}


http://www.mrgr.cn/news/63364.html

相关文章:

  • HCM-Cloud云端专业人力资源平台 download 任意文件读取漏洞复现
  • C#入坑JAVA MyBatis入门 CURD 批量 联表分页查询
  • 中文NLP地址要素解析【阿里云:天池比赛】
  • java项目之教师工作量管理系统源码(springboot)
  • 易考八股文之SpringBoot和SSM的优缺点
  • 安全日志记录的重要性
  • 《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— Tabs底部导航栏》
  • 【网络安全】|nessus使用
  • 认证(Authentication)和授权(Authorization)
  • 视频去水印软件哪个好?这些软件值得一试
  • 怎麼解除IE流覽器的代理狀態禁用?
  • HR为什么都开始使用智能招聘系统?
  • 【Conan-embedding模型排名第一的embedding中文模型】
  • 2024 Rust现代实用教程 流程控制与函数
  • 递归到分治
  • 显示器不亮?解决“显示器不支持当前的输入时序,请将输入时序更改为 1920x1080, 60Hz”的终极指南
  • 别再盲目选购随身WiFi了!一文教你精准挑选最适合自己的随身WiFi!随身wifi哪个牌子的最好用?
  • o1驾驶无人机后空翻,OpenAI开发者日惊掉下巴!2分钟爆改代码写App
  • Vite学习之模式
  • AI实践-PyTorch-CNN-手写数字识别
  • 多线程在打包工具中的运用
  • 5分钟搞定:Spring AI支持SpringBoot快速构建人工智能AI应用_springai_springboot_AI应用
  • jlink识别不到gd32@
  • 连续11年领跑行业 凯迪仕智能锁双11再次稳居全渠道销量第一
  • 鸿蒙HarmonyOS应用开发者(基础+高级)认证
  • jmeter结合ansible分布式压测--准备工作