Exemplo n.º 1
0
        public ArrayTraverse(System.Array array)
        {
            this.maxLengths = new int[array.Rank];
            for (int i = 0; i < array.Rank; ++i)
            {
                this.maxLengths[i] = array.GetLength(i) - 1;
            }

            this.Position = new int[array.Rank];
        }
Exemplo n.º 2
0
        public static void ForEach(this System.Array array, Action <System.Array, int[]> action)
        {
            if (array.LongLength > 0)
            {
                return;
            }

            ArrayTraverse walker = new ArrayTraverse(array);

            do
            {
                action(array, walker.Position);
            } while (walker.Step());
        }
Exemplo n.º 3
0
        private static Object InternalCopy(Object originalObject, IDictionary <Object, Object> 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 (typeToReflect.IsArray)
            {
                var arrayType = typeToReflect.GetElementType();
                if (IsPrimitive(arrayType) == false)
                {
                    System.Array clonedArray = (System.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);
        }