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); }