diff --git a/ObjectExtensions.cs b/ObjectExtensions.cs index 02ea1cc..fff1d35 100644 --- a/ObjectExtensions.cs +++ b/ObjectExtensions.cs @@ -6,12 +6,12 @@ namespace System { public static class ObjectExtensions { - private static readonly MethodInfo CloneMethod = typeof(Object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance); + private static readonly MethodInfo CloneMethod = typeof(Object).GetTypeInfo().GetDeclaredMethod("MemberwiseClone"); - public static bool IsPrimitive(this Type type) + public static bool IsValue(this Type type) { if (type == typeof(String)) return true; - return (type.IsValueType & type.IsPrimitive); + return type.GetTypeInfo().IsValueType; } public static Object Copy(this Object originalObject) @@ -22,14 +22,14 @@ private static Object InternalCopy(Object originalObject, IDictionary array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices)); @@ -37,31 +37,35 @@ private static Object InternalCopy(Object originalObject, IDictionary !info.IsStatic && !info.FieldType.GetTypeInfo().IsPrimitive); + RecursiveCopyBaseTypeFields(originalObject, visited, cloneObject, typeToReflect); return cloneObject; } - private static void RecursiveCopyBaseTypePrivateFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect) + private static void RecursiveCopyBaseTypeFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect) { - if (typeToReflect.BaseType != null) + if (typeToReflect.GetTypeInfo().BaseType != null) { - RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType); - CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, BindingFlags.Instance | BindingFlags.NonPublic, info => info.IsPrivate); + RecursiveCopyBaseTypeFields(originalObject, visited, cloneObject, typeToReflect.GetTypeInfo().BaseType); + CopyFields(originalObject, visited, cloneObject, typeToReflect.GetTypeInfo().BaseType, info => !info.IsStatic && !info.FieldType.GetTypeInfo().IsPrimitive); } } - 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) + private static void CopyFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect, Predicate filter = null) { - foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags)) + List filtered = new List(typeToReflect.GetTypeInfo().DeclaredFields); + if (filter != null) + { + filtered = filtered.FindAll(filter); + } + foreach (FieldInfo fieldInfo in filtered) { - if (filter != null && filter(fieldInfo) == false) continue; - if (IsPrimitive(fieldInfo.FieldType)) continue; var originalFieldValue = fieldInfo.GetValue(originalObject); var clonedFieldValue = InternalCopy(originalFieldValue, visited); fieldInfo.SetValue(cloneObject, clonedFieldValue); } } + public static T Copy(this T original) { return (T)Copy((Object)original); @@ -87,7 +91,7 @@ public static class ArrayExtensions { public static void ForEach(this Array array, Action action) { - if (array.LongLength == 0) return; + if (array.Length == 0) return; ArrayTraverse walker = new ArrayTraverse(array); do action(array, walker.Position); while (walker.Step()); @@ -128,4 +132,4 @@ public bool Step() } } -} +} \ No newline at end of file