Пример #1
0
    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());
        }
    }
Пример #2
0
 private static int CompareToStringMembers(ToStringMember a, ToStringMember b)
 {
     return(a.Name.CompareTo(b.Name));
 }