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

本文关键字:枚举 文本 索引值 返回 API HttpResponseMessage Web | 更新日期: 2023-09-27 18:36:48

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

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

我应该为它设置什么?

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

如果要在 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());
  });
您可以使用

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

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()}.

这将

返回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)));

您可以添加以下帮助程序方法:

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()
});

我已经为枚举创建了一个扩展:

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