[英]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
類型。 為了能夠將int
或string
值轉換為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.