.NET Core 中带有枚举值的抽象通用自定义结果 class(枚举不序列化)

Abstract generic custom result class with enum values in .NET Core (enum does not serialize)

你好,我尝试创建两个抽象 classes,一个 class 带有内容,另一个带有状态,因此多个项目可以继承它并添加它们的枚举状态和它们的内容并将其用于它自己的目的。我正在使用 .NET 5.0。我有下一个代码。

public enum EnumValues { Success,Fail}


public abstract class EnumStatus<TEnum> where TEnum : System.Enum
{
    public TEnum Status { get; set; }
    protected EnumStatus(TEnum status)
    {
        Status = status;
    }
}

public abstract class Result<T> : EnumStatus<System.Enum>
{
    public T Content { get; set; }
    
    protected Result(System.Enum status) : base(status)
    {

    }

    protected Result(T content, System.Enum status) : base(status)
    {
        Content = content;
    }
   
}

我有我的自定义结果 class 即

public class CustomResult<T> : Result<T>
{
    public CustomResult(System.Enum status) : base(status)
    {
    }

    public CustomResult(T content, System.Enum status) : base(content, status)
    {
        
    }

    public static implicit operator CustomResult<T>(T content)
    {
        return new CustomResult<T>(content, EnumValues.Success);
    }

    public static implicit operator CustomResult<T>(EnumValues status)
    {
        return new CustomResult<T>(status);
    }

}

所以当我在我的控制器中使用它时

public async Task<IActionResult> Test()
{
      return new JsonResult(new CustomResult<bool>(true,EnumValues.Success));
}

我在邮递员电话中得到的回复是

{
"content": true,
"status": {}
}

内容总是 returned 但我的状态总是空的,调试它内容和状态在构造函数中设置有效且正确但是当它被 returned 到客户端时状态总是空的,但是如果我 return 使用隐式运算符的结果,例如

return Ok(EnumValues.Success)

它return 有效结果。 有人可以向我解释为什么会这样吗?有什么解决办法吗?或者我犯了一些愚蠢的错误

修复它的最简单方法是使用 Newtonsoft.Json。 将此代码添加到启动

using Newtonsoft.Json.Serialization;

services.AddControllers()
.AddNewtonsoftJson(options =>
  options.SerializerSettings.ContractResolver =
        new CamelCasePropertyNamesContractResolver());

如果您想继续Text.Json

services.AddControllers()
.AddJsonOptions(options =>
new JsonSerializerOptions
{
    Converters = { new JsonStringEnumConverter() },
    WriteIndented = true,
});

var options = new JsonSerializerOptions
    {
        Converters = { new JsonStringEnumConverter() },
        WriteIndented = true,
    };
var json = System.Text.Json.JsonSerializer.Serialize(result, options);
     
var obj = System.Text.Json.JsonSerializer.Deserialize<CustomResult<bool,EnumValues>>(json,options);

并修复类

public abstract class Result<T,TEnum> : EnumStatus<TEnum> where TEnum : Enum
{
    public T Content { get; set; }

    protected Result(TEnum status) : base(status)
    {

    }

    protected Result(T content, TEnum status) : base(status)
    {
        Content = content;
    }

    
}


public class CustomResult<T,TEnum> : Result<T,TEnum>  where TEnum : Enum
{
    
    public CustomResult(TEnum status) : base(status)
    {
    }
    [System.Text.Json.Serialization.JsonConstructorAttribute]
    public CustomResult(T content, TEnum status) : base(content, status)
    {

    }
}