通过反射从其他对象设置对象属性

时间:2011-01-11 17:50:44

标签: c# reflection loops properties

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

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

您可以查看AutoMapper

答案 2 :(得分:1)

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

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

根据我的经验,如果你有一个非平凡的类和/或类层次结构(特别是有不存在的默认构造函数的可能性),最简单,最可靠的方法是,只写一个“复制构造函数”(在.NET中不存在),并自己完成工作,实现ICloneable,自己完成工作,或者实现自己的克隆方法,自己做的工作;)

答案 3 :(得分:0)

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