如何从data model中抹去所有的guid值

68 阅读1分钟

        private void EraseGuid(object classInstance)
        {
            Find_MemberGuid_And_Erase(classInstance);

            Traverse_Members_For_NestedClassInstance(classInstance);
        }

        private object Get_MemberPropertyInstance_By_Property(object classInstance, PropertyInfo property)
        {
            return property.GetValue(classInstance);
        }

        private object Get_MemberFieldInstance_By_Field(object classInstance, FieldInfo field)
        {
            return field.GetValue(classInstance);
        }

        private void Find_MemberGuid_And_Erase(object classInstance) 
        {
            // if guid is a property
            var guidProperty = classInstance.GetType().GetProperty("guid");
            if (guidProperty != null)
            {
                guidProperty.SetValue(classInstance, String.Empty);
                return;
            }

            //if guid is a field
            var guidField = classInstance.GetType().GetField("guid");
            if (guidField != null)
            {
                guidField.SetValue(classInstance, String.Empty);
            }
        }

        private void Traverse_Members_For_NestedClassInstance(object classInstance)
        {
            foreach (var property in classInstance.GetType().GetProperties())
            {
                if(!IsArray(property))
                {
                    if(IsNestedClass(property))
                    {
                        var memberPropertyInstance = Get_MemberPropertyInstance_By_Property(classInstance, property);

                        EraseGuid(memberPropertyInstance);
                    }
                }
                else
                {
                    Array array = (Array)property.GetValue(classInstance);

                    Traverse_ArrayElements_For_NestedClassInstance(array);
                }
            }

            foreach (var field in classInstance.GetType().GetFields())
            {
                if (!IsArray(field))
                {
                    if (IsNestedClass(field))
                    {
                        var memberFieldInstance = Get_MemberFieldInstance_By_Field(classInstance, field);

                        EraseGuid(memberFieldInstance);
                    }
                }
                else
                {
                    Array array = (Array)field.GetValue(classInstance);

                    Traverse_ArrayElements_For_NestedClassInstance(array);
                }
            }
        }

        private bool IsNestedClass(PropertyInfo property)
        {
            return property.PropertyType.IsClass && !property.PropertyType.IsAssignableFrom(typeof(string));
        }

        private bool IsArray(PropertyInfo property)
        {
            return property.PropertyType.IsArray;
        }

        private bool IsNestedClass(FieldInfo field)
        {
            return field.FieldType.IsClass && !field.FieldType.IsAssignableFrom(typeof(string));
        }

        private bool IsArray(FieldInfo field)
        {
            return field.FieldType.IsArray;
        }

        private void Traverse_ArrayElements_For_NestedClassInstance(Array array)
        {
            if (array == null)
                return;

            for (int i = 0; i < array.Length; i++)
            {
                object element = array.GetValue(i);
                EraseGuid(element);
            }
        }