2016-09-17 144 views
-1

我正在爲現有API創建一個庫。我目前有每個請求類的QueryParameter類。 QueryParameter類很簡單,但它們有所不同(不是所有的請求都採用相同的查詢參數)。將匿名對象的屬性和值轉換爲字典

這裏是一個QueryParameter類的例子:

public class ApiRequestAQueryParameters 
{ 
    public string Name { get; set; } 
    public int Start { get; set; } 
    public int Stop { get; set; } 
} 

我感興趣的方式來這樣的類轉換成一個字典,我可以養活我們的Web客戶端。我希望能有這樣一個可重複使用的方法:

private Dictionary<string, string> GenerateQueryParameters(object queryParametersObject) 
{ 
// perform conversion 
} 

這樣我就不必拔出QueryParameter性質爲每個請求(會有幾十請求)

,我的理由使用QueryParameter類而不是使QueryParameter成爲每個API請求類的Dictionary屬性是開發者友好的。我想要讓其他人可以通過查看這些類來構建這些API請求。

回答

0

有2種方法:1)使用反射和2)序列化到JSON和回。

這裏是第一個方法:

private Dictionary<string, string> GenerateQueryParameters(object queryParametersObject) 
{ 
    var res = new Dictionary<string, string>(); 
    var props = queryParametersObject.GetType().GetProperties(); 
    foreach (var prop in props) 
    { 
     res[prop.Name] = prop.GetValue(queryParametersObject).ToString(); 
    } 
    return res; 
} 
0

你可以做這樣的事情:

private Dictionary<string, string> GenerateQueryParameters(object queryParameters) 
{ 
    var startStop = new StartStop() { Start = queryParameters.Start, Stop = queryParameters.Stop}; 
    var result = new Dictionary<string, string>(); 
    result.Add(queryParameters.Name, startStop); 
    return result; 
} 

public class StartStop 
{ 
    public int Start { get; set; } 
    public int Stop { get; set; } 
} 
0

這可能是利用ExpandoObjects完美的情況。 ExpandoObject是一個動態類型,其屬性可以在運行時創建。 ExpandoObject實現IDictionary <字符串,對象>因此很容易將其轉換爲字典< string,object>。

在下面的示例中,將創建ExpandoObject並將其轉換爲字典< string,object>,然後轉換爲字典< string,string>。

dynamic apiVar = new ExpandoObject(); 
apiVar.Name = "Test"; 
apiVar.Start = 1; 
apiVar.Stop = 2; 

var iDict = (IDictionary<string, object>) apiVar; 
/* if you can utilize a Dictionary<string, object> */ 
var objectDict = iDict.ToDictionary(i => i.Key, i => i.Value); 
/* if you need a Dictionary<string, string> */ 
var stringDict = iDict.ToDictionary(i=>i.Key, i=> i.Value.ToString()); 

在ExpandoObject上設置屬性的方法也不同。以下是通過變量名稱設置屬性的示例。

dynamic apiVar = new ExpandoObject(); 
var propertyName = "Name"; 
apiVar[propertyName] = "Test"; 
propertyName = "Start"; 
apiVar[propertyName] = 1; 
propertyName = "Stop"; 
apiVar[propertyName] = 2; 
0

我總是重複使用RouteValueDictionary類。它有一個接受任何對象的構造函數,而類本身實現了IDictionary。

這是在對System.Web DLL提供

private Dictionary<string, string> GenerateQueryParameters(object queryParametersObject) 
{ 
    return new RouteValueDictionary(queryParametersObject).ToDictionary(d => d.Key, d => Convert.ToString(d.Value)); 
}