在 C# 中动态构建带有可选参数的 GET 查询
Dynamically constructing a GET query with optional parameters in C#
我有一个 class,其中包含我正在构建的查询可能具有的所有属性(其中大部分是可选的)
例如:
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
.
如果您不介意反射命中,只需投影、过滤 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!);
我有一个 class,其中包含我正在构建的查询可能具有的所有属性(其中大部分是可选的)
例如:
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
.
如果您不介意反射命中,只需投影、过滤 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!);