using System.Collections; using System.Linq; using System.Reflection; using System.Runtime.Serialization; using Newtonsoft.Json; using Newtonsoft.Json.Converters; namespace TradeManageNew.APIClients.FedexAPI.Utils { internal class EnumCollectionConverter : JsonConverter { private readonly StringEnumConverter _stringEnumConverter = new StringEnumConverter(); public override bool CanConvert(System.Type objectType) { return objectType.IsGenericType && typeof(IEnumerable).IsAssignableFrom(objectType) && objectType.GetGenericArguments()[0].IsEnum; } public override object ReadJson(JsonReader reader, System.Type objectType, object existingValue, JsonSerializer serializer) { throw new System.NotImplementedException("Deserialization is not implemented."); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value is IEnumerable enumCollection) { // 遍历集合并获取每个枚举的字符串值 var enumNames = enumCollection.Cast() .Select(GetEnumMemberValue) .ToList(); serializer.Serialize(writer, enumNames); } else { throw new System.InvalidOperationException("Expected an enumerable type."); } } private static string GetEnumMemberValue(object enumValue) { var enumType = enumValue.GetType(); var memberInfo = enumType.GetMember(enumValue.ToString()).FirstOrDefault(); if (memberInfo != null) { var enumMemberAttr = memberInfo.GetCustomAttribute(); if (enumMemberAttr != null) { return enumMemberAttr.Value; } } return enumValue.ToString(); } } }