C#用反射实现两个类的对象之间相同属性的值的复制

目录

1.适用于创建实体的时候从一个实体作为数据源赋值

2.适用于没有创建实体,两个实体之间数据的转换


1.适用于创建实体的时候从一个实体作为数据源赋值

复制代码
/// <summary>
/// 反射实现两个类的对象之间相同属性的值的复制
/// 适用于初始化新实体
/// </summary>
/// <typeparam name="D">返回的实体</typeparam>
/// <typeparam name="S">数据源实体</typeparam>
/// <param name="s">数据源实体</param>
/// <returns>返回的新实体</returns>
public static D Mapper<D, S>(S s)
{
    D d = Activator.CreateInstance<D>(); //构造新实例
    try
    {
        var Types = s.GetType();//获得类型  
        var Typed = typeof(D);
        foreach (PropertyInfo sp in Types.GetProperties())//获得类型的属性字段  
        {
            foreach (PropertyInfo dp in Typed.GetProperties())
            {
                if (dp.Name == sp.Name && dp.PropertyType == sp.PropertyType && dp.Name!= "Error" && dp.Name != "Item")//判断属性名是否相同  
                {
                    dp.SetValue(d, sp.GetValue(s, null), null);//获得s对象属性的值复制给d对象的属性  
                }
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    return d;
}

2.适用于没有创建实体,两个实体之间数据的转换

复制代码
/// <summary>
/// 反射实现两个类的对象之间相同属性的值的复制
/// 适用于没有新建实体之间
/// </summary>
/// <typeparam name="D">返回的实体</typeparam>
/// <typeparam name="S">数据源实体</typeparam>
/// <param name="d">返回的实体</param>
/// <param name="s">数据源实体</param>
/// <returns></returns>
public static D MapperToModel<D, S>(D d,S s)
{
    try
    {
        var Types = s.GetType();//获得类型  
        var Typed = typeof(D);
        foreach (PropertyInfo sp in Types.GetProperties())//获得类型的属性字段  
        {
            foreach (PropertyInfo dp in Typed.GetProperties())
            {
                if (dp.Name == sp.Name && dp.PropertyType == sp.PropertyType && dp.Name != "Error" && dp.Name != "Item")//判断属性名是否相同  
                {
                    dp.SetValue(d, sp.GetValue(s, null), null);//获得s对象属性的值复制给d对象的属性  
                }
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    return d;
}
相关推荐
在放️10 分钟前
Python 爬虫 · 第三方代理接入与合规使用
开发语言·爬虫·python
KANGBboy17 分钟前
java知识五(继承)
java·开发语言
c++之路19 分钟前
Bazel C++ 构建系列文档(三):构建第一个 C++ 项目
开发语言·c++
AI人工智能+电脑小能手21 分钟前
【大白话说Java面试题 第117题】【并发篇】第17题:线程有几种状态,之间如何转换?
java·开发语言·面试
聚名网2 小时前
域名net,com,cn有区别吗?有哪些不同呢?
服务器·开发语言·php
牛油果子哥q2 小时前
STL set与map底层精讲,红黑树适配原理、有序去重特性、迭代器遍历、API实战与面试核心考点全解
开发语言·数据结构·c++·面试
foundbug9992 小时前
直流电机 PID 速度控制 MATLAB 仿真程序
开发语言·matlab
Tian_Hang3 小时前
C++原型模式(Protype)
开发语言·c++·算法
天天讯通3 小时前
OKCC 呼叫中心安全性能全解析:技术防护与管理措施指南
大数据·开发语言·网络·人工智能·安全·语音识别
xufengzhu3 小时前
第三方 Python 库 redis-py + hiredis 的使用
开发语言·redis·python