public static string Format(object obj, Style style) { Type type = obj.GetType(); _cache.Clear(); if (!_cache.TryGetValue(obj.GetType(), out var desc)) { ToStringDescription toStringDescription = default(ToStringDescription); toStringDescription.Type = type; toStringDescription.Members = new List <ToStringMember>(); desc = toStringDescription; _cache.Add(type, desc); BindingFlags attrs = BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; FieldInfo[] fields = type.GetFields(attrs); foreach (FieldInfo k in fields) { ToStringMember toStringMember = default(ToStringMember); toStringMember.Member = k; toStringMember.Name = k.Name; ToStringMember item = toStringMember; Type dataType2 = k.GetDataType(); if (dataType2 == typeof(string)) { item.Format = "\"{0}\""; } _ = k.GetDataType().IsArray; if (dataType2.HasElementType) { item.Format = "{1}[{2}] {0}"; } desc.Members.Add(item); } desc.Members.Sort(CompareToStringMembers); } lock (_stringBuilder) { _stringBuilder.Clear(); if (style.ShowRootObjectType) { _stringBuilder.Append(desc.Type.Name); _stringBuilder.Append(style.ObjectDelimiter); } for (int i = 0; i < desc.Members.Count; i++) { ToStringMember j = desc.Members[i]; Type dataType = j.Member.GetDataType(); object val = j.Member.GetValue(obj); _stringBuilder.Append(dataType.Name); _stringBuilder.Append(" "); _stringBuilder.Append(j.Name); _stringBuilder.Append(style.MemberNameValueDelimiter); if (val == null) { _stringBuilder.Append("null"); } else { Type vtype = val.GetType(); if (vtype.HasElementType) { Type etype = vtype.GetElementType(); string ecount = "?"; _stringBuilder.AppendFormat(j.Format, val, etype, ecount); } else { _stringBuilder.AppendFormat(j.Format, val); } } if (i != desc.Members.Count - 1) { _stringBuilder.Append(style.MemberDelimiter); } } return(_stringBuilder.ToString()); } }
private static int CompareToStringMembers(ToStringMember a, ToStringMember b) { return(a.Name.CompareTo(b.Name)); }