我有一个类(例如Foo
)覆盖 ToString 方法来打印它的内部状态。这个类有一个集合Foo
——它是子元素。孩子也可以生孩子等等。
我正在寻找在 ToString() 中实现的解决方案,它会自动缩进子元素,例如:
Parent Foo
Child1 Foo
Child1.1 Foo
Child2 Foo
Child2.1 Foo
Child2.2 Foo
我有一个类(例如Foo
)覆盖 ToString 方法来打印它的内部状态。这个类有一个集合Foo
——它是子元素。孩子也可以生孩子等等。
我正在寻找在 ToString() 中实现的解决方案,它会自动缩进子元素,例如:
Parent Foo
Child1 Foo
Child1.1 Foo
Child2 Foo
Child2.1 Foo
Child2.2 Foo
解决方案是ToString()
仅用作在子树的根上调用以输出的“入口点”。该ToString()
方法可以调用ToIndentedString(int)
将当前缩进级别作为参数的私有方法。然后,该方法将返回指定缩进处当前节点的字符串表示,以及缩进 + 1 处所有子节点的字符串表示等。
public string ToString()
{
return ToIndentedString(0);
}
private string ToIndentedString(int indentation)
{
StringBuilder result = new StringBuilder();
result.Append(' ', indentation);
result.Append(Environment.NewLine);
foreach (Foo child in children) {
result.Append(child.ToIndentedString(indentation + 1));
}
return result.ToString();
}
你也可以这样IFormattable
使用Foo
:
public class Foo : IFormattable
{
public string Text { get; set; }
public IList<Foo> InnerList { get; set; }
public string ToString(string format, IFormatProvider formatProvider)
{
if (String.IsNullOrEmpty(format)) format = "0";
if (formatProvider == null) formatProvider = CultureInfo.CurrentCulture;
int indent = 0;
Int32.TryParse(format, out indent);
string indentString = "";
while(indent > indentString.Length)
{
indentString += " ";
}
var toString = String.Format("{0}{1}", indentString, Text);
foreach (Foo foo in InnerList ?? new List<Foo>())
{
toString += String.Format("\n{0}", foo.ToString((indent + 1).ToString(), formatProvider));
}
return toString;
}
public override string ToString()
{
return ToString("0", CultureInfo.CurrentCulture);
}
}
在这种情况下,您还可以执行以下操作:
String.Format("{0:5}", foo); // Start with 5 indents
或者
foo.ToString("7", CultureInfo.CurrentCulture); // Also start with indents (7 in this case)
string spacing = " ";
string newLineSpacing = string.Format("{0}{1}", Environment.NewLine, spacing);
StringBuilder sb = new StringBuilder("mydata");
foreach (Foo child in children)
{
sb.Append(Environment.NewLine);
sb.Append(spacing);
sb.Append(child.ToString().Replace(Environment.NewLine, newLineSpacing));
}
未经测试,因为我目前正在重建我的开发机器。