You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
2.0 KiB
C#

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<object>()
.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<EnumMemberAttribute>();
if (enumMemberAttr != null)
{
return enumMemberAttr.Value;
}
}
return enumValue.ToString();
}
}
}