Last active
April 21, 2026 08:26
-
-
Save Naskalin/c2ec79ba6dfe611d5cce3925830c766e to your computer and use it in GitHub Desktop.
Произвольное приведение объекта реквеста к виду query string.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /// <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