gpt4 book ai didi

c# - 是否有 System.Text.Json 属性只允许有效的枚举值?

转载 作者:行者123 更新时间:2023-12-05 01:58:39 25 4
gpt4 key购买 nike

我有一个枚举:

public enum TaxType : byte
{
None = 0,
GSTCanada = 5,
HSTOntario = 13,
HSTOther = 15
}

它在 json 中由一个数字给出。例如:

{"TaxType": 13, ...}
public class OrderInfo
{
public TaxType TaxType { get; set; }
/// ...
}

它将成功反序列化,但如果值为 NOT (0 OR 5 OR 13 OR 15),我想抛出异常。

是否可以通过使用 System.Text.Json 的属性来实现?

最佳答案

改进@MestreDosMagros 的回答:

我创建了一个 [CheckedEnum] 属性。

如果该值不在枚举中,它将抛出异常。

[Flags] 枚举需要不同的算法。

示例:
public class OrderInfo
{
public TaxType TaxType { get; set; }
}

[CheckedEnum]
public enum TaxType : byte
{
None = 0,
GSTCanada = 5,
HSTOntario = 13,
HSTOther = 15
}

(.NET fiddle tests)

代码:

public class CheckedEnumAttribute : JsonConverterAttribute { public CheckedEnumAttribute() : base(typeof(CheckedEnumConverterFactory)) { } }

public class CheckedEnumConverterFactory : JsonConverterFactory
{
public override bool CanConvert(Type typeToConvert)
=> typeToConvert.IsEnum;

public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
=> (JsonConverter)Activator.CreateInstance(typeof(CheckedEnumConverter<>).MakeGenericType(typeToConvert));
}

public class CheckedEnumConverter<T> : JsonConverter<T> where T: struct, Enum
{
static readonly TypeCode typeCode = Type.GetTypeCode(typeof(T));

public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
T value = (T)(object)(typeCode switch
{
TypeCode.SByte => reader.GetSByte(),
TypeCode.Byte => reader.GetByte(),
TypeCode.Int16 => reader.GetInt16(),
TypeCode.UInt16 => reader.GetUInt16(),
TypeCode.Int32 => reader.GetInt32(),
TypeCode.UInt32 => reader.GetUInt32(),
TypeCode.Int64 => reader.GetInt64(),
TypeCode.UInt64 => reader.GetUInt64()
});
if (!Enum.IsDefined(value)) throw new Exception($"Value {value} is invalid!");
return value;
}

public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
if (!Enum.IsDefined(value)) throw new Exception($"Value {value} is invalid!");
if (typeCode == TypeCode.UInt64)
writer.WriteNumberValue((ulong)(object)value);
else
writer.WriteNumberValue(Convert.ToInt64(value));
}
}

关于c# - 是否有 System.Text.Json 属性只允许有效的枚举值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68397757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com