【发布时间】:2011-01-11 17:50:44
【问题描述】:
所以基本上,我一直在寻找一种方法来克隆一个对象并复制其属性,然后添加一个。创建一个类似乎很傻,继承现有的对象然后有一堆 this.prop = obj.prop;
我认为可能有一种简单的方法可以通过反射和循环 obj 的属性来设置“this”的属性。想法?
【问题讨论】:
标签: c# reflection loops properties
所以基本上,我一直在寻找一种方法来克隆一个对象并复制其属性,然后添加一个。创建一个类似乎很傻,继承现有的对象然后有一堆 this.prop = obj.prop;
我认为可能有一种简单的方法可以通过反射和循环 obj 的属性来设置“this”的属性。想法?
【问题讨论】:
标签: c# reflection loops properties
是的,你可以通过反射来做到这一点:
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"
【讨论】:
你可以看看AutoMapper。
【讨论】:
这完全取决于您想要的克隆类型。如果你想要浅克隆,这很容易。循环遍历对象的属性并将它们设置在克隆上就可以做到这一点。但这意味着包含引用的属性将引用与克隆相同的源对象。
如果你想要一个深度克隆,你必须找到一种方法来克隆源对象拥有的引用(以及源拥有的引用所拥有的引用等)。如果这些引用没有默认构造函数,这可能无法以自动化方式完成。
根据我的经验,归结为,如果您有一个重要的类和/或类层次结构(特别是可能不存在默认构造函数),最简单、最可靠的方法是只需编写一个“复制构造函数”(在 .NET 中不存在),然后自己完成工作,实现 ICloneable,然后自己完成工作,或者实现自己的 Clone 方法,然后执行自己工作;)
【讨论】:
如果类是可序列化的,您可能可以使用Xml serialization 序列化一个类,然后反序列化到另一个。
【讨论】: