public override IEnumerable<string> GetAttributesTextFor(FieldInfo field, Usage defaultUsage, ParsingPolicyAttribute[] parsingPolicies) { var res = new List<string>(base.GetAttributesTextFor(field, defaultUsage, parsingPolicies)); var fieldType = field.FieldType; var renameRule = field.GetCustomAttribute<RenameAttribute>(); string fieldName = field.GetCustomAttribute<NameAttribute>()?.Name ?? field.Name; if (!field.IsDefined<RefAttribute>()) { if (field.IsPolymorphic()) { Type attributeType = !fieldType.IsArray || field.IsDefined<InlineAttribute>() ? typeof(XmlElementAttribute) : typeof(XmlArrayItemAttribute); foreach (var t in field.GetKnownSerializableTypes()) res.Add(GetItemAttributeText(attributeType, t, renameRule)); } else if ( field.FieldType.IsArray && !field.IsDefined<ConverterAttribute>() && !field.IsDefined<ParserAttribute>() && !parsingPolicies.Any(p => p.CanParse(field.FieldType))) { Type attributeType = field.IsDefined<InlineAttribute>() ? typeof(XmlElementAttribute) : typeof(XmlArrayItemAttribute); Type itemTypeName = field.FieldType.GetElementType(); res.Add(GetItemAttributeText(attributeType, itemTypeName, renameRule)); } } var rawFieldType = field.GetRawFieldType(parsingPolicies); if (rawFieldType.IsSimple()) { res.Add(AttributeBuilder.GetTextFor<XmlAttributeAttribute>(fieldName)); } else if (!res.Any(a => a.Contains(nameof(XmlElementAttribute)))) { if (rawFieldType.IsArray) res.Add(AttributeBuilder.GetTextFor<XmlArrayAttribute>(fieldName)); else res.Add(AttributeBuilder.GetTextFor<XmlElementAttribute>(fieldName)); } if (field.IsDefined<HiddenAttribute>()) res.Add(AttributeBuilder.GetTextFor<XmlIgnoreAttribute>()); return res.Where(a => a != null); }
public virtual IEnumerable<string> GetAttributesTextFor(FieldInfo field, Usage defaultUsage, ParsingPolicyAttribute[] parsingPolicies) { var result = new List<string>(); var fieldType = field.FieldType; string usageAttribute = null; bool isForcedUsage = defaultUsage == Usage.ForceRequired || defaultUsage == Usage.ForceOptional; if (isForcedUsage) { if (defaultUsage == Usage.ForceRequired) usageAttribute = AttributeBuilder.GetTextFor<RequiredAttribute>(); else if (defaultUsage == Usage.ForceOptional) usageAttribute = AttributeBuilder.GetTextFor<OptionalAttribute>(); } else if (fieldType.IsValueType && Nullable.GetUnderlyingType(field.FieldType) == null) { usageAttribute = AttributeBuilder.GetTextFor<RequiredAttribute>(); } else if (Nullable.GetUnderlyingType(field.FieldType) != null) { usageAttribute = AttributeBuilder.GetTextFor<OptionalAttribute>(); } else if (!field.IsDefined<RequiredAttribute>() && !field.IsDefined<OptionalAttribute>()) { if (defaultUsage == Usage.Required) usageAttribute = AttributeBuilder.GetTextFor<RequiredAttribute>(); else if (defaultUsage == Usage.Optional) usageAttribute = AttributeBuilder.GetTextFor<OptionalAttribute>(); } if (usageAttribute != null) result.Add(usageAttribute); var attributes = field.GetCustomAttributes().ToArray(); var attributesData = field.GetCustomAttributesData(); for (int i = 0; i < attributes.Length; i++) { // Skip any usage attributes, if field usage is forced by the calling method. bool isUsageAttribute = attributes[i] is OptionalAttribute || attributes[i] is RequiredAttribute; if (isForcedUsage && isUsageAttribute) continue; // Get c# compatible attribute text. string attributeText = CommonAttributeTranslator.Translate(attributes[i], attributesData[i], field); if (attributeText != null) result.Add(attributeText); } return result; }