我使用ServiceStack v 3.9.71和ServiceStack.Text.EnumMemberSerializer
程序集将枚举序列化为可读文本。
这很有效,我的枚举值被序列化为我使用EnumMemberAttribute
指定的名称。
但问题是,Swagger没有使用我的名字。我的猜测是它只是在枚举值而不是.ToString()
值上调用EnumMemberAttribute
方法。
以下是我设置序列化的顺序。 (在AppHost中):
new EnumSerializerConfigurator()
.WithEnumTypes(new Type[] { typeof(MyEnum) })
.Configure();
Plugins.Add(new SwaggerFeature());
如果在添加招摇功能之前或之后设置了枚举序列化器,那似乎无关紧要。
答案 0 :(得分:2)
在解析枚举值时,Swagger代码不使用ServiceStack.Text.EnumMemberSerializer是正确的。它仅使用Enum.GetValues
here。请注意,这在v4中仍然相同。
您可以提交拉取请求以进行此更改,但我不熟悉EnumMemberSerialzer以及它如何允许检索枚举选项列表。您可以改为使用用ApiAllowableValues修饰的字符串属性来实现效果。
答案 1 :(得分:1)
这是我提出的解决方案(在bpruitt-goddard的帮助下,感谢队友):
枚举:
public enum MyEnum
{
[EnumMember(Value = "Value One")]
Value1 = 1,
[EnumMember(Value = "Value Two")]
Value2 = 2,
[EnumMember(Value = "Value Three")]
Value3 = 3
}
客户端对象:
public class MyClientObject
{
[Description("The name")]
public string Name {get;set;}
[Description("The client object type")]
[ApiAllowableValues("MyEnum", "Value One", "Value Two", "Value Three")]
public MyEnum MyEnum { get; set; }
}
AppHost内部:
new EnumSerializerConfigurator()
.WithEnumTypes(new Type[] { typeof(MyEnum) })
.Configure();
现在enum已正确序列化并且Swagger文档正确无误。唯一的问题是在两个不同的地方有名字。也许有办法通过单元测试检查名称匹配。
答案 2 :(得分:1)
在我看来,我提出了一个更好的解决方案。我写了一个扩展ApiAllowableValuesAttribute
:
public class ApiAllowableValues2Attribute : ApiAllowableValuesAttribute
{
public ApiAllowableValues2Attribute(string name, Type enumType)
: base(name)
{
List<string> values = new List<string>();
var enumTypeValues = Enum.GetValues(enumType);
// loop through each enum value
foreach (var etValue in enumTypeValues)
{
// get the member in order to get the enumMemberAttribute
var member = enumType.GetMember(
Enum.GetName(enumType, etValue)).First();
// get the enumMember attribute
var enumMemberAttr = member.GetCustomAttributes(
typeof(System.Runtime.Serialization.EnumMemberAttribute), true).First();
// get the enumMember attribute value
var enumMemberValue = ((System.Runtime.Serialization.EnumMemberAttribute)enumMemberAttr).Value;
values.Add(enumMemberValue);
}
Values = values.ToArray();
}
}
客户端对象:
public class MyClientObject
{
[Description("The name")]
public string Name {get;set;}
[Description("The client object type")]
[ApiAllowableValues2("MyEnum", typeof(MyEnum))]
public MyEnum MyEnum { get; set; }
}
现在您不必再次指定名称或担心更改Swagger文档的名称。