【问题标题】:Setting object properties from other object via reflection通过反射从其他对象设置对象属性
【发布时间】:2011-01-11 17:50:44
【问题描述】:

所以基本上,我一直在寻找一种方法来克隆一个对象并复制其属性,然后添加一个。创建一个类似乎很傻,继承现有的对象然后有一堆 this.prop = obj.prop;

我认为可能有一种简单的方法可以通过反射和循环 obj 的属性来设置“this”的属性。想法?

【问题讨论】:

标签: c# reflection loops properties


【解决方案1】:

是的,你可以通过反射来做到这一点:

http://wraithnath.blogspot.com/2011/01/how-to-copy-and-object-with-reflection.html

                    //Copy the properties
                foreach ( PropertyInfo oPropertyInfo in oCostDept.GetType().GetProperties() )
                {
                    //Check the method is not static
                    if ( !oPropertyInfo.GetGetMethod().IsStatic )
                    {
                        //Check this property can write
                        if ( this.GetType().GetProperty( oPropertyInfo.Name ).CanWrite )
                        {
                            //Check the supplied property can read
                            if ( oPropertyInfo.CanRead )
                            {
                                //Update the properties on this object
                                this.GetType().GetProperty( oPropertyInfo.Name ).SetValue( this, oPropertyInfo.GetValue( oCostDept, null ), null );
                            }
                        }
                    }
                }

[1]:http://wraithnath.blogspot.com/2011/01/how-to-copy-and-object-with-reflection.html"

【讨论】:

    【解决方案2】:

    你可以看看AutoMapper。

    【讨论】:

      【解决方案3】:

      这完全取决于您想要的克隆类型。如果你想要浅克隆,这很容易。循环遍历对象的属性并将它们设置在克隆上就可以做到这一点。但这意味着包含引用的属性将引用与克隆相同的源对象。

      如果你想要一个深度克隆,你必须找到一种方法来克隆源对象拥有的引用(以及源拥有的引用所拥有的引用等)。如果这些引用没有默认构造函数,这可能无法以自动化方式完成。

      根据我的经验,归结为,如果您有一个重要的类和/或类层次结构(特别是可能不存在默认构造函数),最简单、最可靠的方法是只需编写一个“复制构造函数”(在 .NET 中不存在),然后自己完成工作,实现 ICloneable,然后自己完成工作,或者实现自己的 Clone 方法,然后执行自己工作;)

      【讨论】:

      • 谢谢 - 我就是这么想的,但我想在深入研究之前先问一下。
      • 反射是一项伟大的资产,它为编码事物开辟了许多额外的替代途径。与最强大的东西一样,在正确考虑“常规”替代方案之前,使用它很容易。过去,我曾多次被反射的无限魔力咬伤过自己。从那时起,我学会了尊重它;)
      【解决方案4】:

      如果类是可序列化的,您可能可以使用Xml serialization 序列化一个类,然后反序列化到另一个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        • 2010-10-11
        • 1970-01-01
        • 2015-02-12
        • 2010-10-26
        相关资源
        最近更新 更多