Example #1
0
        private static object CreateDeepCopyInternal(CopyingState state, object o)
        {
            object exist_object;

            if (state.TryGetValue(o, out exist_object))
            {
                return(exist_object);
            }

            if (o is Array)
            {
                object array_copy = CreateArrayDeepCopy(state, (Array)o);
                state[o] = array_copy;
                return(array_copy);
            }
            else if (o is string)
            {
                object string_copy = string.Copy((string)o);
                state[o] = string_copy;
                return(string_copy);
            }
            else
            {
                Type o_type = o.GetType();
                if (o_type.IsPrimitive)
                {
                    return(o);
                }
                object copy = memberwise_clone.Invoke(o, null);
                state[o] = copy;
                foreach (FieldInfo f in o_type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
                {
                    object original = f.GetValue(o);
                    if (!object.ReferenceEquals(original, null))
                    {
                        f.SetValue(copy, CreateDeepCopyInternal(state, original));
                    }
                }
                return(copy);
            }
        }