Skip to content

Instantly share code, notes, and snippets.

@Naskalin
Last active April 21, 2026 08:26
Show Gist options
  • Select an option

  • Save Naskalin/c2ec79ba6dfe611d5cce3925830c766e to your computer and use it in GitHub Desktop.

Select an option

Save Naskalin/c2ec79ba6dfe611d5cce3925830c766e to your computer and use it in GitHub Desktop.
Произвольное приведение объекта реквеста к виду query string.
/// <summary>
/// Sample
/// var req = new UserListRequest { Page = 1, Search = "test", TagIds = [1, 2] };
/// var url = "api/users".SetQueryParams(req);
/// </summary>
public static class StringQueryParamsExtension
{
public static string SetQueryParam(this string url, string key, object? value)
{
var val = ObjToString(value);
if (string.IsNullOrEmpty(val)) return url;
var sysUri = new Uri(url);
var query = HttpUtility.ParseQueryString(sysUri.Query);
query[HttpUtility.UrlEncode(key)] = HttpUtility.UrlEncode(val);
return $"{sysUri.GetLeftPart(UriPartial.Path)}?{query}";
}
public static string SetQueryParams<T>(this string url, T entity) where T : class
{
var props = entity.GetType().GetProperties();
var str = new StringBuilder(url);
var isFirst = true;
foreach (var prop in props.Where(r => r.GetValue(entity) != null))
{
var propValue = prop.GetValue(entity);
var propName = prop.Name;
string? val;
switch (propValue)
{
case int[] arrInt:
{
var obj = new object[arrInt.Length];
foreach (var item in arrInt.Select((v, k) => new { v, k }))
{
obj[item.k] = item.v.ToString();
}
val = ArrayToString(propName, obj);
break;
}
case object?[] optArr:
val = ArrayToString(propName, optArr);
break;
default:
val = SingleToString(propName, propValue);
break;
}
if (string.IsNullOrEmpty(val)) continue;
str.Append(isFirst ? "?" : "&");
isFirst = false;
str.Append(val);
}
return str.ToString();
}
private static string ArrayToString(string key, object?[] arr)
{
var str = new StringBuilder();
foreach (var obj in arr)
{
var data = SingleToString(key, obj);
if (string.IsNullOrEmpty(data)) continue;
if (str.Length > 0) str.Append('&');
str.Append(data);
}
return str.ToString();
}
private static string? SingleToString(string key, object? obj)
{
var val = ObjToString(obj);
return string.IsNullOrEmpty(val) ? null : $"{HttpUtility.UrlEncode(key)}={HttpUtility.UrlEncode(val)}";
}
private static string? ObjToString(object? obj)
{
var val = obj switch
{
DateOnly date => date.ToString("yyyy-MM-dd"),
TimeOnly time => time.ToString("HH:mm:ss"),
DateTime dateTime => dateTime.ToUniversalTime().ToString("O"),
_ => obj?.ToString()
};
return string.IsNullOrEmpty(val) ? null : val;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment