使用string.Join代替foreach

时间:2019-04-28 14:04:12

标签: c# string linq join

我正在尝试重构代码,使其更小巧,外观更好。我试图覆盖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来完成这项工作,但是我不知道该怎么做。感谢您的建议!

2 个答案:

答案 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}},并根据需要进行修改。