Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Json.NET中,如何处理缺少的枚举值以选择另一个值_C#_Json_Enums_Json.net - Fatal编程技术网

C# 在Json.NET中,如何处理缺少的枚举值以选择另一个值

C# 在Json.NET中,如何处理缺少的枚举值以选择另一个值,c#,json,enums,json.net,C#,Json,Enums,Json.net,我想从我的枚举中删除一个枚举值。但是,当反序列化JSON时,如果找到已删除的枚举值,则应选择我选择的枚举值,而不是默认为None,这是我的枚举中向后兼容的第一个值 例如: public enum ExampleHotkeyType { None, CaptureRegion, CaptureRegionWindow, CaptureRegionPolygon, CaptureRegionFreehand } 我想删除此枚举中的CaptureRegionW

我想从我的枚举中删除一个枚举值。但是,当反序列化JSON时,如果找到已删除的枚举值,则应选择我选择的枚举值,而不是默认为
None
,这是我的枚举中向后兼容的第一个值

例如:

public enum ExampleHotkeyType
{
    None,
    CaptureRegion,
    CaptureRegionWindow,
    CaptureRegionPolygon,
    CaptureRegionFreehand
}
我想删除此枚举中的
CaptureRegionWindow
,如果发现
CaptureRegionWindow
则反序列化时,我想将其分配给
CaptureRegion
。这样它就不会默认为
None

我搜索过,也许我可以将
CaptureRegion
enum值设置为具有多个名称作为属性,但找不到这样的内容

处理此问题的最佳方法是什么,这样我的用户设置就不会重置


注意:序列化/反序列化时我正在使用StringEnumConverter。

继承StringEnumConverter允许我对其进行完全控制:

public class ExampleHotkeyTypeEnumConverter : StringEnumConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.String)
        {
            string enumText = reader.Value.ToString();

            if (!string.IsNullOrEmpty(enumText) && enumText.Equals("CaptureRegionWindow"))
            {
                return ExampleHotkeyType.CaptureRegion;
            }
        }

        return base.ReadJson(reader, objectType, existingValue, serializer);
    }
}

[JsonConverter(typeof(ExampleHotkeyTypeEnumConverter))]
public enum ExampleHotkeyType
{
    None,
    CaptureRegion,
    CaptureRegionWindow,
    CaptureRegionPolygon,
    CaptureRegionFreehand
}
如果要保留现有枚举值,则可以改用此枚举转换器:

public class SafeStringEnumConverter : StringEnumConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        try
        {
            return base.ReadJson(reader, objectType, existingValue, serializer);
        }
        catch (JsonSerializationException)
        {
            return existingValue;
        }
    }
}

作为一种通用解决方案,我建议创建类似于.NET
EnumMember
的属性,该属性将接受多个值,然后在反序列化阶段使用它-这样我们可以支持任意枚举。下面是支持
EnumMember
属性的转换器。