2016-12-02 72 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

你是一個開始謝謝布賴恩! –