好的,这可能可以清理一下,但我会编写两个自定义转换器:一个用于Enum
类型,另一个用于枚举值:
我创建了一个自定义类来序列化为您想要的最终结果:
public class EnumValue
{
public int Value { get; set; }
public string Name { get; set; }
public string Label { get; set; }
}
以及一个静态类,它执行一些从创建该类型实例的工作Enum
s 和枚举值:
public static class EnumHelpers
{
public static EnumValue GetEnumValue(object value, Type enumType)
{
MemberInfo member = enumType.GetMember(value.ToString())[0];
DisplayAttribute attribute =
member.GetCustomAttribute<DisplayAttribute>();
return new EnumValue
{
Value = (int)value,
Name = Enum.GetName(enumType, value),
Label = attribute.Name
};
}
public static EnumValue[] GetEnumValues(Type enumType)
{
Array values = Enum.GetValues(enumType);
EnumValue[] result = new EnumValue[values.Length];
for (int i = 0; i < values.Length; i++)
{
result[i] = GetEnumValue(
values.GetValue(i),
enumType);
}
return result;
}
}
然后有两个转换器类。这第一个连载System.Type
进入你想要的对象:
public class EnumTypeConverter : JsonConverter
{
public override void WriteJson(
JsonWriter writer,
object value,
JsonSerializer serializer)
{
if (value == null)
{
writer.WriteNull();
return;
}
EnumValue[] values = EnumHelpers.GetEnumValues((Type)value);
serializer.Serialize(writer, values);
}
public override object ReadJson(
JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
{
throw new NotSupportedException();
}
public override bool CanRead { get { return false; } }
public override bool CanConvert(Type objectType)
{
return typeof(Type).IsAssignableFrom(objectType);
}
}
然后是序列化实际枚举值的一个:
public class EnumValueConverter : JsonConverter
{
public override void WriteJson(
JsonWriter writer,
object value,
JsonSerializer serializer)
{
if (value == null)
{
writer.WriteNull();
return;
}
EnumValue result = EnumHelpers.GetEnumValue(value, value.GetType());
serializer.Serialize(writer, result);
}
public override object ReadJson(
JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
{
throw new NotSupportedException();
}
public override bool CanRead { get { return false; } }
public override bool CanConvert(Type objectType)
{
return objectType.IsEnum;
}
}
以下是您将如何使用它们:
var pr = new ProjectDto();
pr.CurrentStatus = Status.Active;
pr.StatusEnum = typeof(Status);
var settings = new JsonSerializerSettings();
settings.Converters = new JsonConverter[]
{
new EnumTypeConverter(),
new EnumValueConverter()
};
settings.Formatting = Newtonsoft.Json.Formatting.Indented;
string serialized = JsonConvert.SerializeObject(pr, settings);
Example: https://dotnetfiddle.net/BVp7a2 https://dotnetfiddle.net/BVp7a2