static void PostProcessProperty(PropertyInfo property, HashSet <string> includedProperties, HashSet <string> ignoredProperties, HashSet <Type> serializableContainerTypes) { var propertyType = property.PropertyType; if (serializableContainerTypes.Contains(propertyType)) { return; } var propertyName = property.Name; var includeField = includedProperties != null && includedProperties.Contains(propertyName); if (!includeField) { if (ignoredProperties != null && ignoredProperties.Contains(propertyName)) { return; } if (property.GetGetMethod(true) == null) { return; } var setMethod = property.GetSetMethod(true); if (setMethod == null) { return; } var isValidProperty = false; foreach (var attribute in property.CustomAttributes) { var attributeType = attribute.AttributeType; if (attributeType == k_NativePropertyAttributeType) { isValidProperty = true; break; } if (attributeType == k_NativeNameAttributeType) { isValidProperty = true; break; } } // ReSharper disable once BitwiseOperatorOnEnumWithoutFlags if ((setMethod.MethodImplementationFlags & MethodImplAttributes.InternalCall) != 0) { isValidProperty = true; } if (!isValidProperty) { return; } } if (propertyType.IsArray) { propertyType = propertyType.GetElementType(); } else if (ReflectedPropertyBagUtils.IsListType(propertyType)) { propertyType = propertyType.GenericTypeArguments[0]; } if (!CodeGenUtils.IsSerializableContainer(propertyType)) { return; } serializableContainerTypes.Add(propertyType); }
static void PostProcessField(FieldInfo field, HashSet <string> includedProperties, HashSet <string> ignoredProperties, HashSet <Type> serializableContainerTypes) { var fieldType = field.FieldType; if (serializableContainerTypes.Contains(fieldType)) { return; } var fieldName = field.Name; var includeField = includedProperties != null && includedProperties.Contains(fieldName); if (!includeField) { if (ignoredProperties != null && ignoredProperties.Contains(fieldName)) { return; } if (!field.IsPublic) { var isValidField = false; foreach (var attribute in field.GetCustomAttributes()) { var attributeType = attribute.GetType(); if (attributeType == k_NativeNameAttributeType || attributeType == typeof(SerializableAttribute)) { isValidField = true; } if (attributeType == k_IgnoreAttributeType) { isValidField = false; break; } } if (!isValidField) { return; } } } if (fieldType.IsArray) { fieldType = fieldType.GetElementType(); } else if (ReflectedPropertyBagUtils.IsListType(fieldType)) { fieldType = fieldType.GenericTypeArguments[0]; } if (fieldType == null || fieldType.IsGenericParameter || fieldType.IsGenericType) { return; } if (!CodeGenUtils.IsSerializableContainer(fieldType)) { return; } serializableContainerTypes.Add(fieldType); }