Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Standard/ObjectCopier.cs =================================================================== diff -u -r4031 -r4052 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Standard/ObjectCopier.cs (.../ObjectCopier.cs) (revision 4031) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Standard/ObjectCopier.cs (.../ObjectCopier.cs) (revision 4052) @@ -49,120 +49,119 @@ using System.Collections.Generic; using System.Reflection; -namespace Deltares.DamEngine.Data.Standard +namespace Deltares.DamEngine.Data.Standard; + +/// +/// Class to handle copying of objects +/// +public static class ObjectCopier { + private static readonly MethodInfo CloneMethod = typeof(Object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance); + /// - /// Class to handle copying of objects + /// Determines whether this instance is primitive. /// - public static class ObjectCopier + /// The type. + /// + /// true if the specified type is primitive; otherwise, false. + /// + public static bool IsPrimitive(this Type type) { - private static readonly MethodInfo CloneMethod = typeof(Object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance); + if (type == typeof(String)) + { + return true; + } - /// - /// Determines whether this instance is primitive. - /// - /// The type. - /// - /// true if the specified type is primitive; otherwise, false. - /// - public static bool IsPrimitive(this Type type) + return type.IsValueType && type.IsPrimitive; + } + + /// + /// Copies the specified original object. + /// + /// The original object. + /// + public static Object Copy(Object originalObject) + { + 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) { - if (type == typeof(String)) - { - return true; - } + return null; + } - return type.IsValueType && type.IsPrimitive; + Type typeToReflect = originalObject.GetType(); + if (IsPrimitive(typeToReflect)) + { + return originalObject; } - /// - /// Copies the specified original object. - /// - /// The original object. - /// - public static Object Copy(Object originalObject) + if (visited.ContainsKey(originalObject)) { - return InternalCopy(originalObject, new Dictionary(new ReferenceEqualityComparer())); + return visited[originalObject]; } - /// - /// Copies the specified original object with specified type. - /// - /// - /// The original. - /// - public static T Copy(this T original) + if (typeof(Delegate).IsAssignableFrom(typeToReflect)) { - return (T) Copy((Object) original); + return null; } - private static Object InternalCopy(Object originalObject, IDictionary visited) + object cloneObject = CloneMethod.Invoke(originalObject, null); + if (typeToReflect.IsArray) { - if (originalObject == null) + Type arrayType = typeToReflect.GetElementType(); + if (!IsPrimitive(arrayType)) { - return null; + var clonedArray = (Array) cloneObject; + clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices)); } + } - Type typeToReflect = originalObject.GetType(); - if (IsPrimitive(typeToReflect)) - { - return originalObject; - } + visited.Add(originalObject, cloneObject); + CopyFields(originalObject, visited, cloneObject, typeToReflect); + RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect); + return cloneObject; + } - if (visited.ContainsKey(originalObject)) - { - return visited[originalObject]; - } - - if (typeof(Delegate).IsAssignableFrom(typeToReflect)) - { - return null; - } - - object cloneObject = CloneMethod.Invoke(originalObject, null); - if (typeToReflect.IsArray) - { - Type arrayType = typeToReflect.GetElementType(); - if (!IsPrimitive(arrayType)) - { - 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) + { + if (typeToReflect.BaseType != null) + { + RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType); + CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, BindingFlags.Instance | BindingFlags.NonPublic, info => info.IsPrivate); } + } - private static void RecursiveCopyBaseTypePrivateFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect) + private static void CopyFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy, Func filter = null) + { + foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags)) { - if (typeToReflect.BaseType != null) + if (filter != null && !filter(fieldInfo)) { - RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType); - CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, BindingFlags.Instance | BindingFlags.NonPublic, info => info.IsPrivate); + continue; } - } - private static void CopyFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy, Func filter = null) - { - foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags)) + if (IsPrimitive(fieldInfo.FieldType)) { - if (filter != null && !filter(fieldInfo)) - { - continue; - } - - if (IsPrimitive(fieldInfo.FieldType)) - { - continue; - } - - object originalFieldValue = fieldInfo.GetValue(originalObject); - object clonedFieldValue = InternalCopy(originalFieldValue, visited); - fieldInfo.SetValue(cloneObject, clonedFieldValue); + continue; } + + object originalFieldValue = fieldInfo.GetValue(originalObject); + object clonedFieldValue = InternalCopy(originalFieldValue, visited); + fieldInfo.SetValue(cloneObject, clonedFieldValue); } } } \ No newline at end of file