C#反射遍历对象属性将对象属性拼接成QueryString字符串按照字母先后顺序排列
最近开发中遇到需要将对象属性动态拼接成querystring格式并要求根据key的字母顺序进行升序排列拼接字符串,记录相关技术细节。后面备用
public class ForeachClass { /// <summary> /// C#反射遍历对象属性 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="model">对象</param> public static ClassPropertyAttrModle ForeachClassProperties<T>(T model, string[] excKeys = null) { ClassPropertyAttrModle results = new ClassPropertyAttrModle(); Type t = model.GetType(); PropertyInfo[] PropertyList = t.GetProperties(); foreach (PropertyInfo item in PropertyList) { string name = item.Name; object value = item.GetValue(model, null); if (!CheckKeyIsExists(excKeys, name)) { results.keys.Add(name); results.Values.Add(value); } } return results; } /// <summary> /// 检验指定数组中是否存在指定字符串 /// </summary> /// <param name="keys"></param> /// <param name="value"></param> /// <returns></returns> private static bool CheckKeyIsExists(string[] keys, string value) { bool res = false; if (keys != null && keys.Length > 0) { foreach (var item in keys) { if (item == value) { res = true; break; } } } return res; } /// <summary> /// 获取对象属性名称和值 /// </summary> /// <param name="obj"></param> /// <returns>用&拼接的结果</returns> public static string GetPropertyNameAndValue(object obj) { if (obj == null) { return string.Empty; } StringBuilder result = new StringBuilder(); try { System.Reflection.PropertyInfo[] propertys = obj.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { object valueObj = pi.GetValue(obj, null); if (valueObj == null) { continue; } Type valueType = valueObj.GetType(); if (valueType != typeof(object) && Type.GetTypeCode(valueType) == TypeCode.Object)//判断是自定义类 { System.Reflection.PropertyInfo[] classProperty = valueType.GetProperties(); foreach (PropertyInfo property in classProperty) { object childValueObj = property.GetValue(valueObj, null); if (childValueObj == null) { continue; } result.Append(pi.Name + "." + property.Name + "=" + childValueObj.ToString() + "&"); } } else { result.Append(pi.Name + "=" + valueObj.ToString() + "&"); } } } catch (Exception) { } return result.ToString().TrimEnd('&'); } public static string urlParamManager(JObject postArray, string[] exKeys) { ArrayList keys = new ArrayList(); foreach (JToken child in postArray.Children()) { JProperty property = child as JProperty; if (exKeys!=null) { if (!exKeys.Contains(property.Name)) { keys.Add(property.Name); } } else { keys.Add(property.Name); } } keys.Sort(); StringBuilder sb = new StringBuilder(); foreach (string key in keys) { if (!exKeys.Contains(key)) { if (!string.IsNullOrEmpty(postArray[key].Value<string>())) { var value = Uri.EscapeDataString(postArray[key].Value<string>()); value = postArray[key].Value<string>(); if (string.IsNullOrEmpty(sb.ToString())) { sb.Append(key + "=" +value); } else { sb.Append("&" + key + "=" + value); } } } else { var value = Uri.EscapeDataString(postArray[key].Value<string>()); value = postArray[key].Value<string>(); if (string.IsNullOrEmpty(sb.ToString())) { sb.Append(key + "=" + value); } else { sb.Append("&" + key + "=" + value); } } } return sb.ToString(); } } /// <summary> /// 类的属性键值提取 /// </summary> public class ClassPropertyAttrModle { public List<string> keys { get; set; } = new List<string>(); public List<object> Values { get; set; } = new List<object>(); }
代码调用:
var filterStr = "sign"; var urlData = ForeachClass.urlParamManager(JObject.FromObject(data),filterStr.Split(','));
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构