/// <summary> /// 将字节流转换为指定对象 /// </summary> /// <param name="bytes"> </param> /// <param name="formatProvider"> 它提供有关当前实例的格式信息 </param> /// <returns> </returns> public virtual T Deserialize <T>(byte[] bytes, IFormatProvider formatProvider) { try { var instance = Activator.CreateInstance <T>(); var props = PropertyHandlerCollection.Get(typeof(T)); var kv = Deserialize(bytes, formatProvider); if (kv == null) { throw new NotSupportedException("无法转为实体"); } foreach (var o in kv) { props[o.Key]?.SetValue(instance, o.Value); } return(instance); } catch (Exception ex) { if (bytes?.Length > 0) { var charset = formatProvider?.GetFormat(typeof(Encoding)) as Encoding; if (charset == null) { ex.Data["ResponseBody"] = ex.Source = "base64:" + Convert.ToBase64String(bytes); } else { ex.Data["ResponseBody"] = ex.Source = charset.GetString(bytes); } } throw; } }
/// <summary> /// 追加实体对象到 Http 参数 /// </summary> /// <param name="param"> 参数将被追加到的参数集合 </param> /// <param name="model"> 需要追加到 Http 参数的实体对象 </param> public static void AddModel(this HttpParamsBase <object> param, object model) { if (param == null) { throw new ArgumentNullException(nameof(param)); } if (model == null) { return; } var props = PropertyHandlerCollection.Get(model.GetType()); for (int i = 0, length = props.Count; i < length; i++) { var p = props[i]; param[p.Name] = p.GetValue(model); } }
/// <summary> /// 将有一个参数写入<paramref name="buffer" />中 /// </summary> /// <param name="buffer"> 字符缓存 </param> /// <param name="preName"> 参数名 </param> /// <param name="value"> 参数值 </param> private void AppendObject(StringBuilder buffer, string preName, object value) { var str = TryToString(value); if ((str != null) || (value == null)) { if (preName != null) { AppendEscape(buffer, preName); buffer.Append('='); } AppendEscape(buffer, str); return; } var array = (value as IEnumerable)?.GetEnumerator() ?? value as IEnumerator; if (array != null) { switch (ArrayEncodeMode) { case ArrayEncodeMode.Merge: AppendEscape(buffer, preName); buffer.Append('='); if (array.MoveNext()) { var v = array.Current; AppendEscape(buffer, TryToString(v) ?? IOC.ComponentServices.ToJsonString(v)); while (array.MoveNext()) { v = array.Current; buffer.Append(','); AppendEscape(buffer, TryToString(v) ?? IOC.ComponentServices.ToJsonString(v)); } } break; case ArrayEncodeMode.JQuery: if (array.MoveNext()) { AppendObject(buffer, preName + "[]", array.Current); while (array.MoveNext()) { buffer.Append('&'); AppendObject(buffer, preName + "[]", array.Current); } } break; case ArrayEncodeMode.Json: AppendObject(buffer, preName, IOC.ComponentServices.ToJsonString(array)); break; case ArrayEncodeMode.Asp: if (array.MoveNext()) { var i = 0; AppendObject(buffer, $"{preName}[{i}]", array.Current); while (array.MoveNext()) { i++; buffer.Append('&'); AppendObject(buffer, $"{preName}[{i}]", array.Current); } } break; case ArrayEncodeMode.Default: default: if (array.MoveNext()) { AppendObject(buffer, preName, array.Current); while (array.MoveNext()) { buffer.Append('&'); AppendObject(buffer, preName, array.Current); } } break; } return; } var props = PropertyHandlerCollection.Get(value.GetType()); var pCount = props.Count; if (pCount == 0) { if (preName != null) { AppendEscape(buffer, preName); buffer.Append('='); } AppendEscape(buffer, value.ToString()); return; } switch (ObjectEncodeMode) { case ObjectEncodeMode.NameOnly: { AppendObject(buffer, props[0].Name, props[0].GetValue(value)); for (var i = 1; i < pCount; i++) { buffer.Append('&'); AppendObject(buffer, props[i].Name, props[i].GetValue(value)); } } break; case ObjectEncodeMode.JQuery: { AppendObject(buffer, ConcatName(preName, props[0].Name, 1), props[0].GetValue(value)); for (var i = 1; i < pCount; i++) { buffer.Append('&'); AppendObject(buffer, ConcatName(preName, props[i].Name, 1), props[i].GetValue(value)); } } break; case ObjectEncodeMode.Json: AppendObject(buffer, preName, IOC.ComponentServices.ToJsonString(value)); break; case ObjectEncodeMode.Default: default: { AppendObject(buffer, ConcatName(preName, props[0].Name, 0), props[0].GetValue(value)); for (var i = 1; i < pCount; i++) { buffer.Append('&'); AppendObject(buffer, ConcatName(preName, props[i].Name, 0), props[i].GetValue(value)); } } break; } }