簡體   English   中英

將匿名對象的屬性和值轉換為字典

[英]Converting an anonymous object's properties and values to a Dictionary

我正在為現有 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 請求。

有兩種方法: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;
}

你可以這樣做:

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; }
}

這可能是使用 ExpandoObjects 的完美案例。 ExpandoObject 是一種動態類型,其屬性可以在運行時創建。 ExpandoObject 實現了 IDictionary < string, object > 因此很容易轉換為 Dictionary < string, object > 。

在下面的示例中,創建了一個 ExpandoObject 並將其轉換為 Dictionary <string, object>,然后轉換為 Dictionary <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;

我總是為此重用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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM