public
static
class
DeepCopyHelper
{
public
static
object
Copy(
this
object
obj)
{
Object targetDeepCopyObj;
Type targetType = obj.GetType();
if
(targetType.IsValueType ==
true
)
{
targetDeepCopyObj = obj;
}
else
{
targetDeepCopyObj = System.Activator.CreateInstance(targetType);
System.Reflection.MemberInfo[] memberCollection = obj.GetType().GetMembers();
foreach
(System.Reflection.MemberInfo member
in
memberCollection)
{
if
(member.MemberType == System.Reflection.MemberTypes.Field)
{
System.Reflection.FieldInfo field = (System.Reflection.FieldInfo)member;
Object fieldValue = field.GetValue(obj);
if
(fieldValue
is
ICloneable)
{
field.SetValue(targetDeepCopyObj, (fieldValue
as
ICloneable).Clone());
}
else
{
field.SetValue(targetDeepCopyObj, Copy(fieldValue));
}
}
else
if
(member.MemberType == System.Reflection.MemberTypes.Property)
{
System.Reflection.PropertyInfo myProperty = (System.Reflection.PropertyInfo)member;
MethodInfo info = myProperty.GetSetMethod(
false
);
if
(info !=
null
)
{
object
propertyValue = myProperty.GetValue(obj,
null
);
if
(propertyValue
is
ICloneable)
{
myProperty.SetValue(targetDeepCopyObj, (propertyValue
as
ICloneable).Clone(),
null
);
}
else
{
myProperty.SetValue(targetDeepCopyObj, Copy(propertyValue),
null
);
}
}
}
}
}
return
targetDeepCopyObj;
}
}