我注意到我的返回HttpResponseMessage的Web Api方法将枚举值转换为int(值的顺序)。但我想返回枚举文本值。
return Request.CreateResponse(HttpStatusCode.OK, new {MyEnum.Someting, MyEnum.Someting2});
我应该为它设置什么?
答案 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()}
。