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