在.NET Core中使用枚举值抽象泛型自定义结果类(枚举不序列化)



Hello我尝试创建两个抽象类,一个类带有Content,另一个类具有Status,这样多个项目就可以继承它,添加它们的枚举状态和内容,并将其用于自己的目的。我使用的是.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;
}

}

我有我的自定义结果类

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": {}
}

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

return Ok(EnumValues.Success(

它返回有效的结果。有人能向我解释一下为什么会这样吗?对此有什么解决方案吗?或者我犯了一些愚蠢的错误

修复它的最简单方法是使用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)
{
}
}

最新更新