Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Standard/ObjectCopier.cs =================================================================== diff -u -r3893 -r4000 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Standard/ObjectCopier.cs (.../ObjectCopier.cs) (revision 3893) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Standard/ObjectCopier.cs (.../ObjectCopier.cs) (revision 4000) @@ -51,7 +51,6 @@ namespace Deltares.DamEngine.Data.Standard { - /// /// Class to handle copying of objects /// @@ -68,7 +67,11 @@ /// public static bool IsPrimitive(this Type type) { - if (type == typeof(String)) return true; + if (type == typeof(String)) + { + return true; + } + return type.IsValueType && type.IsPrimitive; } @@ -82,30 +85,55 @@ return InternalCopy(originalObject, new Dictionary(new ReferenceEqualityComparer())); } + /// + /// Copies the specified original object with specified type. + /// + /// + /// The original. + /// + public static T Copy(this T original) + { + return (T) Copy((Object) original); + } + private static Object InternalCopy(Object originalObject, IDictionary visited) { - if (originalObject == null) return null; - var typeToReflect = originalObject.GetType(); - if (IsPrimitive(typeToReflect)) return originalObject; - if (visited.ContainsKey(originalObject)) return visited[originalObject]; - if (typeof(Delegate).IsAssignableFrom(typeToReflect)) return null; - var cloneObject = CloneMethod.Invoke(originalObject, null); + if (originalObject == null) + { + return null; + } + + Type typeToReflect = originalObject.GetType(); + if (IsPrimitive(typeToReflect)) + { + return originalObject; + } + + if (visited.ContainsKey(originalObject)) + { + return visited[originalObject]; + } + + if (typeof(Delegate).IsAssignableFrom(typeToReflect)) + { + return null; + } + + object cloneObject = CloneMethod.Invoke(originalObject, null); if (typeToReflect.IsArray) { - var arrayType = typeToReflect.GetElementType(); + Type arrayType = typeToReflect.GetElementType(); if (!IsPrimitive(arrayType)) { - var clonedArray = (Array)cloneObject; + var clonedArray = (Array) cloneObject; clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices)); } - } visited.Add(originalObject, cloneObject); CopyFields(originalObject, visited, cloneObject, typeToReflect); RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect); return cloneObject; - } private static void RecursiveCopyBaseTypePrivateFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect) @@ -121,23 +149,20 @@ { foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags)) { - if (filter != null && filter(fieldInfo) == false) continue; - if (IsPrimitive(fieldInfo.FieldType)) continue; - var originalFieldValue = fieldInfo.GetValue(originalObject); - var clonedFieldValue = InternalCopy(originalFieldValue, visited); + if (filter != null && filter(fieldInfo) == false) + { + continue; + } + + if (IsPrimitive(fieldInfo.FieldType)) + { + continue; + } + + object originalFieldValue = fieldInfo.GetValue(originalObject); + object clonedFieldValue = InternalCopy(originalFieldValue, visited); fieldInfo.SetValue(cloneObject, clonedFieldValue); } } - - /// - /// Copies the specified original object with specified type. - /// - /// - /// The original. - /// - public static T Copy(this T original) - { - return (T)Copy((Object)original); - } } } \ No newline at end of file