首页 > 解决方案 > 使用 string.Join 代替 foreach

问题描述

我正在尝试重构我的代码以使其更小更好看。我正在尝试覆盖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 结合使用,这样就可以完成这项工作,但我不知道该怎么做。谢谢指教!

标签: c#stringlinqjoin

解决方案


它会是这样的:(编辑:缓存属性信息,而不是在每个 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() 实现应该很快。


推荐阅读