ServiceStack.Text.EnumMemberSerializer不使用Swagger插件

时间:2014-04-22 14:56:12

标签: c# servicestack servicestack-text servicestack-bsd

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

如果在添加招摇功能之前或之后设置了枚举序列化器,那似乎无关紧要。

3 个答案:

答案 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文档的名称。