public static Object Copy(this Object originalObject, bool OrginalTargetForDelegates = false) { ObjectExtensions.OrginalTargetForDelegates = OrginalTargetForDelegates; var Pos = InternalCopy(originalObject.GetType()); visited = new HashSet <ObjectContainer>(); var Result = InternalCopys[Pos] (originalObject); AtLast?.Invoke(); AtLast = null; return(Result); }
private static int InternalCopy(Type typeToReflect) { var pos = System.Array.BinarySearch(TypeCodes, typeToReflect.GetHashCode()); if (pos > -1) { return(CopyPoss[pos]); } else { pos = InternalCopys.Length; Insert(ref InternalCopys, (Func <object, object>)null); Insert(ref CopyPoss, pos, BinaryInsert(ref TypeCodes, typeToReflect.GetHashCode())); Func <object, object> MyInternalCopy; if (IsPrimitive(typeToReflect)) { MyInternalCopy = (originalObject) => originalObject; } else { if (typeToReflect.IsArray | typeToReflect == typeof(System.Array)) { Func <object, (Type ElementType, int Rank, Func <object, object> InternalCopy)> GetInfo = null; Func <object, object> MyInternalCopy_ArrDelegate = (originalObject) => null; Func <object, object> MyInternalCopy_Arr; { MyInternalCopy_Arr = (originalObject) => { var Info = GetInfo(originalObject); var ArrayObject = (System.Array)originalObject; var lents = new int[Info.Rank]; for (int i = 0; i < Info.Rank; i++) { lents[i] = ArrayObject.GetUpperBound(i) + 1; } var cloneObject = System.Array.CreateInstance(Info.ElementType, lents); cloneObject.ForEach(lents, (indices) => { var StandAloneCurrent = new int[Info.Rank]; for (int i = 0; i < Info.Rank; i++) { StandAloneCurrent[i] = indices[i]; } Clone(ArrayObject.GetValue(StandAloneCurrent), (obj) => cloneObject.SetValue(obj, StandAloneCurrent), Info.InternalCopy); }); visited.Add(new ObjectContainer() { obj = cloneObject, HashCode = originalObject.GetHashCode() }); return(cloneObject); }; } if (typeToReflect == typeof(System.Array)) { MyInternalCopy = (originalObject) => { var Pos = InternalCopy(originalObject.GetType()); return(InternalCopys[Pos](originalObject)); }; } else { var ElementType = typeToReflect.GetElementType(); var Rank = typeToReflect.GetArrayRank(); var ICPos = InternalCopy(typeToReflect.GetElementType()); var ArrayInternalCopy = InternalCopys[ICPos]; GetInfo = (ar) => (ElementType, Rank, ArrayInternalCopy); if (IsPrimitive(typeToReflect.GetElementType())) { MyInternalCopy = (ar) => { var ArrayObject = (System.Array)ar; var lents = new int[Rank]; for (int i = 0; i < Rank; i++) { lents[i] = ArrayObject.GetUpperBound(i) + 1; } var cloneObject = System.Array.CreateInstance(ElementType, lents); ArrayObject.CopyTo(cloneObject, 0); return(cloneObject); }; } else { if (typeof(Delegate).IsAssignableFrom(typeToReflect)) { MyInternalCopy = MyInternalCopy_ArrDelegate; } else { MyInternalCopy = MyInternalCopy_Arr; } } } } else { if (typeof(Delegate).IsAssignableFrom(typeToReflect)) { MyInternalCopy = (originalObject) => { var OrginalDelegates = ((Delegate)originalObject).GetInvocationList(); var Results = new Delegate[OrginalDelegates.Length]; for (int i = 0; i < OrginalDelegates.Length; i++) { Results[i] = (Delegate)OrginalDelegates[i].Clone(); } var cloneObject = Delegate.Combine(Results); for (int i = 0; i < OrginalDelegates.Length; i++) { if (OrginalDelegates[i].Target != null) { if (OrginalTargetForDelegates) { Serialization.Deletage_Target.SetValue(Results[i], OrginalDelegates[i].Target); } else { var Pos = InternalCopy(OrginalDelegates[i].Target.GetType()); var ClonedTarget = InternalCopys[Pos](OrginalDelegates[i].Target); Serialization.Deletage_Target.SetValue(Results[i], ClonedTarget); } } } return(cloneObject); }; } else { var Fields = new DynamicAssembly.TypeFields(typeToReflect).Fields; var FieldIInfo = new (Func <(object cloneObject, object FieldValue), object> Copy, DynamicAssembly.FieldControler Field)[Fields.Length];