我有一個類,其中包含我正在構建的查詢可能具有的所有屬性(其中大部分是可選的)
例如:
public class QueryClass
{
public string Offset {get; set;}
public string Limit {get; set;}
public string Sort {get; set;}
}
然后在一種BuildQuery()方法中,我通過執行以下操作來構建查詢:
private string BuildQuery(QueryClass query)
{
var queryDictionary = new Dictionary<string, string>();
if (!string.IsNullOrEmpty(query.Offset)
{
queryDictionary.Add("offset", query.Offset);
}
if (!string.IsNullOrEmpty(query.Limit)
{
queryDictionary.Add("limit", query.Limit);
}
if (!string.IsNullOrEmpty(query.Sort)
{
queryDictionary.Add("sort", query.Sort);
}
var content = new FormUrlEncodedContent(queryDictionary);
return content.ReadAsStringAsync().Result;
}
此作品,但問題是我的實際QueryClass是顯著比這大,我們有了一個更好的辦法來做到這一點,而不是有一噸的,若對所有可選屬性報表,但我一直沒能拿出一個更優雅的解決方案。我也不關心以這種方式在字典中添加鍵,我可能需要一種新方法來構建QueryClass.
uj5u.com熱心網友回復:
如果您不介意反射命中,只需投影、過濾nulls,然后發送到ToDictionary
注意:這里的假設是,所有的屬性名稱都是你的鍵,并且所有的屬性都可以轉換為字串
var queryClass = new QueryClass()
{
Limit = "asdf",
Sort = "Bob"
};
var results = queryClass
.GetType()
.GetProperties()
.Select(x => (Value: x.GetValue(queryClass) as string, x.Name))
.Where(x => !string.IsNullOrWhiteSpace(x.Value))
.ToDictionary(
x => x.Name.ToLower(),
x => x.Value);
foreach (var (key, value) in results)
Console.WriteLine($"{key} : {value}");
輸出
limit : asdf
sort : Bob
加入胡椒和鹽調味
或者作為擴展方法
public static IDictionary<string, string> ConvertToDictionary<T>(this T source)
=> typeof(T).GetProperties()
.Select(x => (Value: x.GetValue(source) as string, x.Name))
.Where(x => !string.IsNullOrWhiteSpace(x.Value))
.ToDictionary(
x => x.Name.ToLower(),
x => x.Value!);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/377707.html
下一篇:OkObjectResultwithContentTypes"application/pdf"郵遞員如何接收到406NotAcceptable
