Web Api,如何从HttpResponseMessage返回枚举文本值而不是枚举索引值

时间:2016-02-29 16:54:47

标签: c# asp.net-web-api enums

我注意到我的返回HttpResponseMessage的Web Api方法将枚举值转换为int(值的顺序)。但我想返回枚举文本值。

return Request.CreateResponse(HttpStatusCode.OK, new {MyEnum.Someting, MyEnum.Someting2});

我应该为它设置什么?

6 个答案:

答案 0 :(得分:11)

如果您要返回并接收Json中的数据,则可以使用StringEnumConverter。定义这样的模型:

class Output
{
    [JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
    public MyEnum[] Enums { get; set; }
}

public HttpResponseMessage Get()
{
    return Request.CreateResponse(HttpStatusCode.OK, new Output { Enums = new MyEnum[] { MyEnum.Someting, MyEnum.Someting2 } }); ;
}

允许您指示json序列化程序将枚举转换为其名称字符串值。

此外,如果您不想定义输出模型,可以在WebApiConfig.Register(config)方法中添加这些行并使用:

var jsonFormatter = config.Formatters.JsonFormatter;
jsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());

和.Net Core Web API使用此:

public void ConfigureServices(IServiceCollection services)
{
  services.AddMvc().AddJsonOptions( op => {
      op.SerializerSettings.Converters.Add(new StringEnumConverter());
  });

答案 1 :(得分:2)

您可以使用Enum.GetName方法

return Request.CreateResponse(HttpStatusCode.OK, new {Enum.GetName(typeof(MyEnum), 0), Enum.GetName(typeof(MyEnum), 1)});

如果这是您要找的? https://msdn.microsoft.com/en-us/library/system.enum.getname(v=vs.110).aspx

答案 2 :(得分:1)

这将返回MyEnum中定义的值的名称:

return Request.CreateResponse(HttpStatusCode.OK, 
    new string[] {MyEnum.Someting.ToString(), MyEnum.Someting2.ToString()});

如果您有多个MyEnum类型的变量,那么您可以简单地对这些变量ToString

MyEnum var1 = MyEnum.Something;
MyEnum var2 = MyEnum.Something2;

return Request.CreateResponse(HttpStatusCode.OK, 
       new string[] {var1.ToString(), var2.ToString()});

如果要返回MyEnum中定义的每个值的名称,可以使用:

return Request.CreateResponse(HttpStatusCode.OK, Enum.GetNames(typeof(MyEnum)));

答案 3 :(得分:0)

您可以添加以下辅助方法:

public static class Enums
{
    public static string GetDescription(this Enum value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());

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

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

然后在枚举中包含说明,例如:

public enum MyEnum
{
    [Description("Something 1")]
    Something1 = 1,
    [Description("Something 2")]
    Something2 = 2
}

最后简单地致电:

return Request.CreateResponse(HttpStatusCode.OK, new 
{ 
    MyEnum.Something1.GetDescription(), 
    MyEnum.Something2.GetDescription()
});

答案 4 :(得分:0)

我为枚举创建了一个扩展程序:

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

        if (null != fi)
        {
            object[] attrs = fi.GetCustomAttributes
                (typeof (DescriptionAttribute), true);
            if (attrs != null && attrs.Length > 0)
                return ((DescriptionAttribute) attrs[0]).Description;
        }
        return null;
    }

    public static IEnumerable<TEnum> GetAllValues<TEnum>()
    {
        return Enum.GetValues(typeof(TEnum)).Cast<TEnum>();
    }
}

你的枚举:

public enum MyEnum
{
    [Description("foobar1 text")]
    foobar1= 1,
    [Description("foobar2 text")]
    foobar2= 2,
    [Description("foobar3 text")]
    foobar3= 3,
    [Description("foobar4 text")]
    foobar3= 4
}

然后这样打电话:

 MyEnum.foobar2.GetDescription()

应该返回foobar2 text

其他解决方案是:

Enum.GetName(typeof(MyEnum.foobar2)) 

返回foobar2

答案 5 :(得分:0)

return Request.CreateResponse(HttpStatusCode.OK, new { TextValueOfSomething = MyEnum.Someting.ToString(), TextValueOfSomething2 = MyEnum.Someting2.ToString() });

您无法返回new {MyEnum.Something.ToString(), MyEnum.Something2.ToString()},因为您无法以这种方式声明一个无趣的对象。如果您只想要一个字符串数组,那么您可以使用new[] {MyEnum.Something.ToString(), MyEnum.Something2.ToString()}