`
ming_7755
  • 浏览: 38014 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

复制对象

 
阅读更多
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Reflection;
using System.Collections;
using System.Windows.Forms;
namespace SilverlightApplication1
{
    /// <summary>
    /// 类属性/字段的值复制工具
    /// </summary>
    public class CopyObjectValue
    {
        /// <summary>
        /// 复制
        /// </summary>
        /// <param name="destination">目标</param>
        /// <param name="source">来源</param>
        /// <returns>成功复制的值个数</returns>
        public static int Copy(object destination, object source)
        {
            if (destination == null || source == null)
            {
                return 0;
            }
            return Copy(destination, source, source.GetType());
        }

        /// <summary>
        /// 复制
        /// </summary>
        /// <param name="destination">目标</param>
        /// <param name="source">来源</param>
        /// <param name="type">复制的属性字段模板</param>
        /// <returns>成功复制的值个数</returns>
        public static int Copy(object destination, object source, Type type)
        {
            return Copy(destination, source, type, null);
        }

        /// <summary>
        /// 复制
        /// </summary>
        /// <param name="destination">目标</param>
        /// <param name="source">来源</param>
        /// <param name="type">复制的属性字段模板</param>
        /// <param name="excludeName">排除下列名称的属性不要复制</param>
        /// <returns>成功复制的值个数</returns>
        public static int Copy(object destination, object source, Type type, IEnumerable<string> excludeName)
        {
            if (destination == null || source == null)
            {
                return 0;
            }
            if (excludeName == null)
            {
                excludeName = new List<string>();
            }
            int i = 0;
            Type desType = destination.GetType();
            foreach (FieldInfo mi in type.GetFields())
            {
                if (excludeName.Contains(mi.Name))
                {
                    continue;
                }
                try
                {
                    FieldInfo des = desType.GetField(mi.Name);
                    if (des != null && des.FieldType == mi.FieldType)
                    {
                        des.SetValue(destination, mi.GetValue(source));
                        i++;
                    }

                }
                catch
                {
                }
            }
        

            foreach (PropertyInfo pi in type.GetProperties())
            {
                if (excludeName.Contains(pi.Name))
                {
                    continue;
                }
                try
                {
                    PropertyInfo des = desType.GetProperty(pi.Name);
                    if (des != null && des.PropertyType == pi.PropertyType && des.CanWrite && pi.CanRead)
                    {
                        des.SetValue(destination, pi.GetValue(source, null), null);
                        i++;
                    }

                }
                catch (Exception ex)
                {
                    //throw ex;
                    MessageBox.Show(ex.Message);
                }
            }

            foreach (object item in type.GetCustomAttributes(true))
            {

                string obj = item.ToString();
            }
            return i;
        }
    }

    #region 扩展方法 For .NET 3.0+
    /// <summary>
    /// 类属性/字段的值复制工具 扩展方法
    /// </summary>
    public static class ClassValueCopier2
    {
        /// <summary>
        /// 获取实体类的属性名称
        /// </summary>
        /// <param name="source">实体类</param>
        /// <returns>属性名称列表</returns>
        public static List<string> GetPropertyNames(this object source)
        {
            if (source == null)
            {
                return new List<string>();
            }
            return GetPropertyNames(source.GetType());
        }
        /// <summary>
        /// 获取类类型的属性名称(按声明顺序)
        /// </summary>
        /// <param name="source">类类型</param>
        /// <returns>属性名称列表</returns>
        public static List<string> GetPropertyNames(this Type source)
        {
            return GetPropertyNames(source, true);
        }
        /// <summary>
        /// 获取类类型的属性名称
        /// </summary>
        /// <param name="source">类类型</param>
        /// <param name="declarationOrder">是否按声明顺序排序</param>
        /// <returns>属性名称列表</returns>
        public static List<string> GetPropertyNames(this Type source, bool declarationOrder)
        {
            if (source == null)
            {
                return new List<string>();
            }
            var list = source.GetProperties().AsQueryable();
            if (declarationOrder)
            {
                list = list.OrderBy(p => p.MetadataToken);
            }
            return list.Select(o => o.Name).ToList(); ;
        }

        /// <summary>
        /// 从源对象赋值到当前对象
        /// </summary>
        /// <param name="destination">当前对象</param>
        /// <param name="source">源对象</param>
        /// <returns>成功复制的值个数</returns>
        public static int CopyValueFrom(this object destination, object source)
        {
            return CopyValueFrom(destination, source, null);
        }

        /// <summary>
        /// 从源对象赋值到当前对象
        /// </summary>
        /// <param name="destination">当前对象</param>
        /// <param name="source">源对象</param>
        /// <param name="excludeName">排除下列名称的属性不要复制</param>
        /// <returns>成功复制的值个数</returns>
        public static int CopyValueFrom(this object destination, object source, IEnumerable<string> excludeName)
        {
            if (destination == null || source == null)
            {
                return 0;
            }
            return CopyObjectValue.Copy(destination, source, source.GetType(), excludeName);
        }

        /// <summary>
        /// 从当前对象赋值到目标对象
        /// </summary>
        /// <param name="source">当前对象</param>
        /// <param name="destination">目标对象</param>
        /// <returns>成功复制的值个数</returns>
        public static int CopyValueTo(this object source, object destination)
        {
            return CopyValueTo(destination, source, null);
        }

        /// <summary>
        /// 从当前对象赋值到目标对象
        /// </summary>
        /// <param name="source">当前对象</param>
        /// <param name="destination">目标对象</param>
        /// <param name="excludeName">排除下列名称的属性不要复制</param>
        /// <returns>成功复制的值个数</returns>
        public static int CopyValueTo(this object source, object destination, IEnumerable<string> excludeName)
        {
            if (destination == null || source == null)
            {
                return 0;
            }
            return CopyObjectValue.Copy(destination, source, source.GetType(), excludeName);
        }

    }
    #endregion
}
分享到:
评论

相关推荐

    复制对象属性

    复制对象的属性值,只复制可读写的第一层的属性值。复制成功返回True,失败返回False。该方法可用于复制简单的对象的属性值,但并不一定代表能完整地复制对象的所有数据并成为提供方的一个副本。

    jQuery实现简单复制json对象和json对象集合操作示例.docx

    浅拷贝只会复制对象的顶层属性,而深拷贝会递归复制整个对象及其嵌套的对象或数组。 1. **浅拷贝**:当仅传递两个对象作为参数时,`jQuery.extend(target, source)`,`target` 对象将接收 `source` 的属性,但不会...

    复制对象(一)copy和mutableCopy方法对应Demo

    本文将详细解析标题“复制对象(一)copy和mutableCopy方法对应Demo”所涵盖的知识点,包括`copy`和`mutableCopy`方法以及浅复制和深复制的概念。 首先,我们来理解`copy`和`mutableCopy`这两个方法。它们是...

    复制对象(二)<NSCopying>协议和属性的copy特性对应的Demo

    例如,当一个对象被多个组件共享,并且这些组件可能独立修改对象时,复制对象可以确保每个组件都有其自己的数据副本,不会互相干扰。 `copy`特性则是Objective-C中的一个关键字,它用于定义属性的行为。当一个对象...

    C# 快速高效率复制对象(表达式树)

    在C#编程中,复制对象是一项常见的任务,特别是在处理数据模型和业务逻辑时。本文将探讨如何高效地复制对象,重点介绍使用表达式树的方法。首先,让我们回顾一下复制对象的常见需求和基本解决办法。 1、需求 开发中...

    JAVA_对象克隆

    这个过程在需要复制对象的所有属性而不创建新类型实例时非常有用。本文将深入探讨Java中的对象克隆,包括其原理、实现方式以及注意事项。 一、对象克隆的原理 在Java中,对象克隆可以通过实现`Cloneable`接口并覆盖...

    MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象

    深拷贝不仅复制对象,还复制对象中引用的对象。在描述中提到的方法,很可能是关于深拷贝的实现。 在Java中,我们可以通过以下几种方法实现对象的深拷贝: 1. **实现Serializable接口**:利用序列化和反序列化来...

    java不同对象及集合的多次复制

    - **浅拷贝**:创建一个新的对象,只复制对象的引用,不复制内部引用的对象。这意味着改变其中一个对象的内部引用对象,会影响另一个对象。 - **深拷贝**:创建一个全新的对象,不仅复制对象本身,还递归复制其...

    ObjectiveC程序设计复制对象PPT教案学习.pptx

    ObjectiveC程序设计复制对象PPT教案学习.pptx

    tencentyun#qcloud-documents#简单复制对象4

    步骤说明1.通过CosConfig类来配置, 初始化客户端CosS3Client.2.执行 copy_object() 方法来复制对象,需要提供存储桶名称和对象

    办公自动化Axure RP8.0 标准课程复制对象、剪切和删除对

    办公自动化Axure RP8.0 标准课程复制对象、剪切和删除对象.mp4

    java对象复制克隆

    **浅拷贝**:在浅拷贝中,新创建的对象与原对象共享同一块内存空间,只复制对象的引用,不复制对象的内容。因此,如果对象包含对其他对象的引用,修改复制对象的这些引用会影响到原始对象。 **深拷贝**:与浅拷贝...

    Objective-C-2.0程序设计-第18章-复制对象PPT课件.ppt

    Objective-C-2.0程序设计-第18章-复制对象PPT课件.ppt

    C#中Clone一个对象的值到另一个对象案例 c#经典案例.pdf

    浅复制只是复制对象的引用,而深复制则是复制对象的所有值。 浅复制 浅复制是 Clone 方法的默认实现,它只是复制对象的引用,而不复制对象的值。例如,下面的代码: ```csharp public class A : ICloneable { ...

    java 对象克隆

    对象克隆主要用于复制或备份对象,以便在不干扰原始对象的情况下对其进行修改或操作。本篇文章将详细探讨Java中的对象克隆及其实现方式。 一、浅克隆与深克隆 在Java中,克隆分为两种类型:浅克隆(Shallow Clone)...

    java类复制一个持久化对象

    在Java编程语言中,对象复制是一项常见的操作,尤其是在处理持久化对象时,为了保持数据的一致性和完整性,正确地复制对象变得尤为重要。本文将深入探讨如何利用反射机制在Java中复制一个持久化对象,理解其背后的...

    类继承与对象复制的细节.zip_类继承与对象复制的细节

    1. **引用复制**:浅拷贝只复制对象的引用,而不是对象本身,所以改变副本不会影响原始对象,反之亦然,除非涉及到可变对象(如列表、字典)。 2. **深拷贝**:深拷贝会创建一个全新的对象,并递归复制嵌套的对象,...

    java对象复制.pdf

    Java提供了多种复制对象的方式,其中最常见的就是通过`clone()`方法。 `clone()`方法是Java `Object`类中的一个`native`方法,它能够创建当前对象的一个副本。但是,直接调用`clone()`可能会抛出`...

    JavaScript 复制对象与Object.assign方法无法实现深复制

    浅复制(Shallow Copy)仅复制对象的第一层属性,如果属性值包含引用类型,则这些引用类型的内容不会被复制,仅仅是复制了指向原始数据的指针。而深复制(Deep Copy)则会递归复制所有的层,并且不复制指向原始数据...

    编程语言java对象复制.pdf

    浅复制仅仅复制对象中的基本类型数据和引用其他对象的引用,而不会复制引用的对象本身;而深复制则会复制对象本身以及所引用的所有对象,从而创建一个完全独立的对象副本。 知识点二:Cloneable接口的作用 在Java中...

Global site tag (gtag.js) - Google Analytics