Fixed a bug in the cloners: if a class has properties with only a setter or only a getter, the property-based clones now ignore that property; added a unit test that verifies types without a default constructor can be cloned as well
git-svn-id: file:///srv/devel/repo-conversion/nusu@248 d2e56fa2-650e-0410-a79f-9358c0239efd
This commit is contained in:
parent
48e1674912
commit
0290444140
7 changed files with 200 additions and 108 deletions
|
@ -196,19 +196,21 @@ namespace Nuclex.Support.Cloning {
|
|||
);
|
||||
for(int index = 0; index < propertyInfos.Length; ++index) {
|
||||
PropertyInfo propertyInfo = propertyInfos[index];
|
||||
Type propertyType = propertyInfo.PropertyType;
|
||||
object originalValue = propertyInfo.GetValue(original, null);
|
||||
if(originalValue != null) {
|
||||
if(propertyType.IsPrimitive || (propertyType == typeof(string))) {
|
||||
// Primitive types can be assigned directly
|
||||
propertyInfo.SetValue(clone, originalValue, null);
|
||||
} else if(propertyType.IsValueType) {
|
||||
// Value types are seen as part of the original type and are thus recursed into
|
||||
propertyInfo.SetValue(clone, shallowCloneComplexPropertyBased(originalValue), null);
|
||||
} else if(propertyType.IsArray) { // Arrays are assigned directly in a shallow clone
|
||||
propertyInfo.SetValue(clone, originalValue, null);
|
||||
} else { // Complex types are directly assigned without creating a copy
|
||||
propertyInfo.SetValue(clone, originalValue, null);
|
||||
if(propertyInfo.CanRead && propertyInfo.CanWrite) {
|
||||
Type propertyType = propertyInfo.PropertyType;
|
||||
object originalValue = propertyInfo.GetValue(original, null);
|
||||
if(originalValue != null) {
|
||||
if(propertyType.IsPrimitive || (propertyType == typeof(string))) {
|
||||
// Primitive types can be assigned directly
|
||||
propertyInfo.SetValue(clone, originalValue, null);
|
||||
} else if(propertyType.IsValueType) {
|
||||
// Value types are seen as part of the original type and are thus recursed into
|
||||
propertyInfo.SetValue(clone, shallowCloneComplexPropertyBased(originalValue), null);
|
||||
} else if(propertyType.IsArray) { // Arrays are assigned directly in a shallow clone
|
||||
propertyInfo.SetValue(clone, originalValue, null);
|
||||
} else { // Complex types are directly assigned without creating a copy
|
||||
propertyInfo.SetValue(clone, originalValue, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -366,20 +368,22 @@ namespace Nuclex.Support.Cloning {
|
|||
);
|
||||
for(int index = 0; index < propertyInfos.Length; ++index) {
|
||||
PropertyInfo propertyInfo = propertyInfos[index];
|
||||
Type propertyType = propertyInfo.PropertyType;
|
||||
object originalValue = propertyInfo.GetValue(original, null);
|
||||
if(originalValue != null) {
|
||||
if(propertyType.IsPrimitive || (propertyType == typeof(string))) {
|
||||
// Primitive types can be assigned directly
|
||||
propertyInfo.SetValue(clone, originalValue, null);
|
||||
} else if(propertyType.IsArray) { // Arrays need to be cloned element-by-element
|
||||
propertyInfo.SetValue(
|
||||
clone,
|
||||
deepCloneArrayPropertyBased((Array)originalValue, propertyType.GetElementType()),
|
||||
null
|
||||
);
|
||||
} else { // Complex types need to be cloned member-by-member
|
||||
propertyInfo.SetValue(clone, deepCloneSinglePropertyBased(originalValue), null);
|
||||
if(propertyInfo.CanRead && propertyInfo.CanWrite) {
|
||||
Type propertyType = propertyInfo.PropertyType;
|
||||
object originalValue = propertyInfo.GetValue(original, null);
|
||||
if(originalValue != null) {
|
||||
if(propertyType.IsPrimitive || (propertyType == typeof(string))) {
|
||||
// Primitive types can be assigned directly
|
||||
propertyInfo.SetValue(clone, originalValue, null);
|
||||
} else if(propertyType.IsArray) { // Arrays need to be cloned element-by-element
|
||||
propertyInfo.SetValue(
|
||||
clone,
|
||||
deepCloneArrayPropertyBased((Array)originalValue, propertyType.GetElementType()),
|
||||
null
|
||||
);
|
||||
} else { // Complex types need to be cloned member-by-member
|
||||
propertyInfo.SetValue(clone, deepCloneSinglePropertyBased(originalValue), null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue