0

我正在使用 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());

在添加 swagger 功能之前或之后设置枚举序列化程序似乎并不重要。

4

3 回答 3

2

您是正确的,Swagger 代码在解析枚举值时不使用 ServiceStack.Text.EnumMemberSerializer。它只使用一个Enum.GetValues here。请注意,这在 v4 中仍然相同。

您可以提交拉取请求以进行此更改,但我不熟悉 EnumMemberSerialzer 以及它如何允许检索枚举选项列表。您可以改为使用用ApiAllowableValues修饰的字符串属性来实现效果。

于 2014-04-25T13:50:51.837 回答
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();

现在枚举已正确序列化,并且 Swagger 文档是正确的。唯一的问题是在两个不同的地方命名。也许有一种方法可以通过单元测试检查名称是否匹配。

于 2014-05-07T18:56:15.110 回答
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 文档。

于 2014-05-14T18:58:17.990 回答