反序列化枚举C#

反序列化枚举C#,c#,json,enums,json.net,C#,Json,Enums,Json.net,可以将枚举字符串动态反序列化为枚举 在我的API和使用我的API的应用程序中,我有这个类 public static class ErrorCodes { public enum General { INCORRECT_PASSWORD, INCORRECT_USERNAME, INVALID_USERNAME } public enum ERROR

可以将枚举字符串动态反序列化为枚举

在我的API和使用我的API的应用程序中,我有这个类

 public static class ErrorCodes
    {
        public enum General
        {
            INCORRECT_PASSWORD,
            INCORRECT_USERNAME,
            INVALID_USERNAME
        }

        public enum ERRORTYPE_1
        {
            DATESPAN_NOT_PERMITTED
        }

        public enum ERRORTYPE_2
        {
            PERIOD_NOT_ALLOWED
        }
    }
在我的API中,我有这个。这就是以JSON格式发送回我的应用程序的内容

public class Error
{

    public string Message { get; set; }
    public Enum Code { get; set; }

    public Error() { }

    public Error(Enum code)
    {
        this.Code = code;
    }

    public Error(string message, Enum code)
    {
        this.Message = message;
        this.Code = code;
    }
}
然后我可以像这样返回我的错误

new Error(ErrorCodes.ERRORTYPE_2.PERIOD_NOT_ALLOWED)
有没有办法让我的枚举分开?我觉得枚举错误代码的超长列表不是很干净,也不可维护

这篇博文和我想做的差不多,但更多的是对枚举的抽象

是否可以将枚举字符串动态反序列化为枚举

如果您正在dotnet core上构建一个Web API项目,那么您链接到的博客中的解决方案非常有效,尽管我会使用标准的
System.Text.Json
库(从core 3.0开始):

使用System.Text.Json.Serialization;
名称空间Foobar
{
[JsonConverter(类型为(JsonStringEnumConverter))]
公众谘询委员会
{
巴=0,
Baz=1
}
}
这将在客户端上将enum
Foo.Bar
转换为
“Bar”
,在服务器上将
“Bar”->Foo.Bar

有没有办法把我的枚举分开?我觉得枚举错误代码的超长列表不是很干净,也不可维护

我不知道我是否能回答这部分,因为看起来你已经用你的类结构回答了。我对你给出的代码是你的目标还是你当前的代码感到困惑


有关枚举的序列化和反序列化的详细信息,请参阅此

是否可以将枚举字符串动态反序列化为枚举

如果您正在dotnet core上构建一个Web API项目,那么您链接到的博客中的解决方案非常有效,尽管我会使用标准的
System.Text.Json
库(从core 3.0开始):

使用System.Text.Json.Serialization;
名称空间Foobar
{
[JsonConverter(类型为(JsonStringEnumConverter))]
公众谘询委员会
{
巴=0,
Baz=1
}
}
这将在客户端上将enum
Foo.Bar
转换为
“Bar”
,在服务器上将
“Bar”->Foo.Bar

有没有办法把我的枚举分开?我觉得枚举错误代码的超长列表不是很干净,也不可维护

我不知道我是否能回答这部分,因为看起来你已经用你的类结构回答了。我对你给出的代码是你的目标还是你当前的代码感到困惑



有关枚举的序列化和反序列化的详细信息,请查看此项。

当JSON转换器将
Enum
值反序列化并发送回应用程序时,枚举值将转换为
Int32
类型。要能够将
int
string
值转换为
Enum
类型,您应该知道要将值转换/反序列化为的枚举类型。因此,您需要将所有错误代码声明为单个枚举类型的一部分(这样您就知道目标枚举类型),或者在响应中包含枚举值的类型,以便执行
Enum.Parse(typeof(TargetEnumType),enumValue)
。如果您使用的是C#8.0,可以通过如下更新
Error
类来实现后一种方法

public class Error<TEnum> where TEnum:Enum
{

    public string Message { get; set; }
    public TEnum Code { get; set; }


    public Type GetEnumType()
    {
        return Code?.GetType();
    }

    public Error() { }

    public Error(TEnum code)
    {
        this.Code = code;
    }

    public Error(string message, TEnum code)
    {
        this.Message = message;
        this.Code = code;
    }
}
公共类错误,其中TEnum:Enum
{
公共字符串消息{get;set;}
公共十进制代码{get;set;}
公共类型GetEnumType()
{
返回代码?.GetType();
}
公共错误(){}
公共错误(TEnum代码)
{
这个。代码=代码;
}
公共错误(字符串消息、TEnum代码)
{
this.Message=消息;
这个。代码=代码;
}
}

当您的
Enum
值被JSON转换器反序列化并发送回应用程序时,Enum值将转换为
Int32
类型。要能够将
int
string
值转换为
Enum
类型,您应该知道要将值转换/反序列化为的枚举类型。因此,您需要将所有错误代码声明为单个枚举类型的一部分(这样您就知道目标枚举类型),或者在响应中包含枚举值的类型,以便执行
Enum.Parse(typeof(TargetEnumType),enumValue)
。如果您使用的是C#8.0,可以通过如下更新
Error
类来实现后一种方法

public class Error<TEnum> where TEnum:Enum
{

    public string Message { get; set; }
    public TEnum Code { get; set; }


    public Type GetEnumType()
    {
        return Code?.GetType();
    }

    public Error() { }

    public Error(TEnum code)
    {
        this.Code = code;
    }

    public Error(string message, TEnum code)
    {
        this.Message = message;
        this.Code = code;
    }
}
公共类错误,其中TEnum:Enum
{
公共字符串消息{get;set;}
公共十进制代码{get;set;}
公共类型GetEnumType()
{
返回代码?.GetType();
}
公共错误(){}
公共错误(TEnum代码)
{
这个。代码=代码;
}
公共错误(字符串消息、TEnum代码)
{
this.Message=消息;
这个。代码=代码;
}
}

不清楚您希望在这里发生什么。您希望JSON看起来像什么?我想在客户端将字符串JSON反序列化为适当的枚举类型。我正在以JSON的形式传递枚举的字符串值和错误对象中的字符串消息。可能的枚举集是否具有重复的值名称
不正确的密码
不允许的日期span>,…,或者您确定它们是唯一的?这有关系吗?目前,它们是唯一的。如果它们不是唯一的,您将无法仅从枚举值字符串反序列化JSON。或者,如果您愿意封装枚举类型信息,请参阅,例如,不清楚您希望在这里发生什么。您希望JSON看起来像什么?我想在客户端将字符串JSON反序列化为适当的枚举类型。我正在以JSON的形式传递枚举的字符串值和错误对象中的字符串消息。可能的枚举集是否具有重复的值名称
不正确的密码
不允许的日期span>,…,或者您确定它们是唯一的?这有关系吗?法罗群岛