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});
我应该为它设置什么?
如果要在 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