gpt4 book ai didi

c# - 在 Swagger 下拉列表和 json 上显示枚举成员友好名称

转载 作者:行者123 更新时间:2023-11-30 18:11:40 26 4
gpt4 key购买 nike

我正在尝试让枚举以大摇大摆的方式和响应显示来自描述(或任何其他属性)的友好名称。还尝试解析在 Controller 操作中的 body/querystring 上设置的友好名称,而不尝试 400 BadRequest 或任何有点验证错误。我还注意到,我拥有的自定义通用 JsonConverter 也无法正常工作。 ReadJson() 方法根本没有被调用。我怎样才能让它工作?

[JsonConverter(typeof(JsonEnumConverter<SortDirectionType>))]
public enum SortDirectionType
{
[Description("asc")]
ASCENDING,
[Description("desc")]
DESCENDING
}

我正在尝试让 swagger-ui 将 asc 和 desc 显示为下拉列表中的值,而不是 ASCENDING 和 DESCENDING。这意味着我不能使用 c.DescribeAllEnumsAsStrings()。如果我不使用它,那么下拉列表会显示 0,1,因为它应该代表枚举成员值。现在我可以使用 [EnumMember(Value="asc"] 属性而不是 [Description("asc")] 属性。但是接下来会发生两件事:

  1. 要么 swagger-ui 抛出客户端验证并用红线突出显示该字段
  2. 或者,如果我尝试在 swagger 之外调用端点,它会返回 400 错误。
  3. 我能够在操作 [FromBody] 参数中成功使用 0,1 或 ASCENDING、DESCENDING 值。然而,这不是预期的。我将接收 asc、desc,并希望能够在 body 模型上成功解析并将其映射到枚举属性。另一方面,当 json 呈现时,它应该呈现友好的名称。

附加代码:

public class JsonEnumConverter<T> : JsonConverter where T : struct, IComparable, IConvertible, IFormattable
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(T);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var type = typeof(T);

if (!type.IsEnum) throw new InvalidOperationException();

var enumDescription = (string)reader.Value;

return enumDescription.GetEnumValueFromDescription<T>();
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var type = typeof(T);

if (!type.IsEnum) throw new InvalidOperationException();

if (value != null)
{
if (value is Enum sourceEnum)
{
writer.WriteValue(sourceEnum.GetDescriptionFromEnumValue());
}
}
}
}

public static class EnumExtensions
{
public static string GetDescriptionFromEnumValue(this Enum @enum)
{
FieldInfo fi = @enum.GetType().GetField(@enum.ToString());

DescriptionAttribute[] attributes =
(DescriptionAttribute[])fi.GetCustomAttributes(
typeof(DescriptionAttribute),
false);

if (attributes != null &&
attributes.Length > 0)
return attributes[0].Description;
else
return @enum.ToString();
}

public static T GetEnumValueFromDescription<T>(this string description)
{
var type = typeof(T);

if (!type.IsEnum)
throw new InvalidOperationException();

foreach (var field in type.GetFields())
{
if (Attribute.GetCustomAttribute(field,
typeof(DescriptionAttribute)) is DescriptionAttribute attribute)
{
if (attribute.Description == description)
return (T)field.GetValue(null);
}
else
{
if (field.Name == description)
return (T)field.GetValue(null);
}
}

throw new ArgumentException($"No matching value for enum {nameof(T)} found from {description}.",$"{nameof(description)}"); // or return default(T);
}
}

https://github.com/domaindrivendev/Swashbuckle/issues/1318

最佳答案

这就是为我做的:

  services.AddSwaggerGen(c => {
c.DescribeAllEnumsAsStrings();
});

I found the it here

关于c# - 在 Swagger 下拉列表和 json 上显示枚举成员友好名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57105392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com