我正在尝试重构代码,使其更小巧,外观更好。我试图覆盖ToString
方法,该方法返回类名及其具有的所有字段及其当前状态。这是我的代码:
public override string ToString()
{
var properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(x => x.Name);
//StringBuilder result = new StringBuilder();
//result.Append(GetType().Name);
//result.Append("(");
//foreach (var e in GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(x => x.Name))
//{
// result.Append(e.Name);
// result.Append(": ");
// result.Append(e.GetValue(this));
// result.Append(";");
// result.Append(" ");
//}
//result.Remove(result.Length - 2, 2);
//result.Append(")");
//return result.ToString();
}
我得到一个建议,可以结合使用string.Join
和一些LINQ来完成这项工作,但是我不知道该怎么做。感谢您的建议!
答案 0 :(得分:2)
类似于: (编辑:缓存属性信息,而不是在每次ToString()调用时重新计算)
static IEnumerable<PropertyInfo> propertyInfos;
static MyClass()
{
propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(x => x.Name);
}
public override string ToString()
{
return $"{GetType().Name}({string.Join("; ", propertyInfos.Select(x => $"{x.Name}: {x.GetValue(this)}"))})";
}
但是,我不建议在ToString()实现中使用这种反射,因为它效率不高,并且ToString()实现应该很快。
答案 1 :(得分:0)
您可以使用ObjectDumper
完成将类的属性字符串化的艰苦工作。
用法示例:
class Demo
{
public int Key { get; set; }
public string Name { get; set; }
public override string ToString()
{
return ObjectDumper.Dump(this, DumpStyle.Console);
}
}
var demo = new Demo() { Key = 1, Name = "Foo" };
Console.WriteLine(demo.ToString());
输出:
{Demo}
Key: 1
Name: "Foo"
如果输出不是您想要的,您可以窃取ObjectDumper
的{{3}},并根据需要进行修改。