2016-12-02 70 views
1

我正在构建一个ASP.NET Web API应用程序,我需要提供一个HTTP GET端点来返回项目中的所有枚举,如以下示例所示:如何让我的项目中的所有枚举为JSON

{ 
    "code": 200, 
    "message": "OK", 
    "data": [ 
     { 
      "EnumNameOne": { 
       "attributeName1": value, 
       "attribute2": value 
      }, 
      "EnumNameTwo": { 
       "attributeName1": value, 
       "attribute2": value, 
       "attributeName3": value 
      } 
     } 
    ] 
} 

我知道我必须使用反射,但我怎样才能构建我的类,以在上面的JSON负载输出?

+0

哪里是你的枚举?你能否在你的问题中包括这个问题? – CodingYoshi

回答

0

我认为如下我会做到这一点:

  1. 做一个通用Result类:

    class Result 
    { 
        public int Code { get; set; } 
        public string Message { get; set; } 
        public object Data { get; set; } 
    } 
    
  2. 作出这样可以返回枚举作为Dictionary<string, Dictionary<string, int>>的方法,例如:

    public static Dictionary<string, Dictionary<string, int>> GetAllEnums(Assembly assembly) 
    { 
        return assembly 
         .GetTypes() 
         .Where(t => t.IsEnum) 
         .ToDictionary(t => t.Name, t => 
          Enum.GetNames(t) 
           .Zip(Enum.GetValues(t).Cast<int>(), (Key, Value) => new { Key, Value }) 
           .ToDictionary(kvp => kvp.Key, kvp => kvp.Value)); 
    } 
    
  3. 把两个放在一起让你的解决方案:

    var allEnums = GetAllEnums(Assembly.GetExecutingAssembly()); 
    
    var result = new Result 
    { 
        Code = 200, 
        Message = "OK", 
        Data = new List<object> { allEnums } 
    }; 
    

    这会给你在你的问题中显示的JSON结构。我应该指出,List<object>在这里并没有真正增加价值,因为它总是只包含一个对象。我只是添加它来匹配你说的你需要的结构。除非你有很强的要求,例如保持与其他API方法的一致性,否则将其忽略是有道理的。

    var result = new Result 
    { 
        Code = 200, 
        Message = "OK", 
        Data = allEnums 
    }; 
    

    随着这一变化,所产生的JSON看起来是这样,而不是:

    { 
        "code": 200, 
        "message": "OK", 
        "data": { 
         "EnumNameOne": { 
          "attributeName1": value, 
          "attribute2": value 
         }, 
         "EnumNameTwo": { 
          "attributeName1": value, 
          "attribute2": value, 
          "attributeName3": value 
         } 
        } 
    } 
    

这里是一个工作演示(控制台应用程序):https://dotnetfiddle.net/pXB4bF


如果您只想获得特定模型类使用的枚举,则可以使用此方法:

static Dictionary<string, Dictionary<string, int>> GetAllEnums(params Type[] types) 
{ 
    return types 
     .SelectMany(t => t.GetProperties()) 
     .Select(p => p.PropertyType) 
     .Where(t => t.IsEnum) 
     .Distinct() 
     .ToDictionary(t => t.Name, t => 
      Enum.GetNames(t) 
       .Zip(Enum.GetValues(t).Cast<int>(), (Key, Value) => new { Key, Value }) 
       .ToDictionary(kvp => kvp.Key, kvp => kvp.Value)); 
} 

小提琴:https://dotnetfiddle.net/Hdrcvj

+0

非常感谢Brian,有没有获得在特定模型中实现的枚举呢?假设只有模型1中使用了enum_1和enum_2,那么如何使用反射来获取这些枚举呢?非常感谢您的回答! –

+0

你是一个开始谢谢布赖恩! –