簡體   English   中英

反序列化枚舉 C#

[英]Deserializing Enums C#

可以將我的枚舉字符串動態反序列化為枚舉。

在我的 API 和使用我的 API 的應用程序中,我有這個 class。

 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)

有沒有辦法讓我的枚舉分開? 我覺得超級長的枚舉錯誤代碼列表不是很干凈或可維護。

這篇博客文章幾乎是我想做的,但對枚舉進行了更多抽象。 https://bytefish.de/blog/enums_json_net/

是否可以將我的枚舉字符串動態反序列化為枚舉?

如果您要在 dotnet-core 上構建 Web API 項目,那么您鏈接到的博客中的解決方案效果很好,盡管我會使用標准System.Text.Json庫(si0885EE6333:

using System.Text.Json.Serialization;

namespace Foobar
{
    [JsonConverter(typeof(JsonStringEnumConverter))]
    public enum Foo
    {
        Bar = 0,
        Baz = 1
    }
}

這會將枚舉Foo.Bar轉換為客戶端上的"Bar" Bar”,以及服務器上的"Bar" -> Foo.Bar

有沒有辦法讓我的枚舉分開? 我覺得超級長的枚舉錯誤代碼列表不是很干凈或可維護。

我不知道我是否可以回答這部分,因為看起來你已經用你的 class 結構做到了。 我對您提供的代碼是您的目標還是您當前的代碼感到困惑。


有關枚舉的序列化和反序列化的更多信息,請查看這篇文章

當您的Enum值由 JSON 轉換器反序列化並發送回應用程序時,枚舉值將轉換為Int32類型。 為了能夠將intstring值轉換為Enum類型,您應該知道要將值轉換/反序列化為的枚舉類型。 因此,您要么需要將所有 ErrorCodes 聲明為單個 Enum 類型的一部分(這樣你就知道目標枚舉類型),要么在響應中包含 typeof 枚舉值,這樣就可以做到Enum.Parse(typeof(TargetEnumType),enumValue) 如果您使用的是 C# 8.0,則可以通過如下更新Error class 來實現后一種方法

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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM