c# - 使用 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 结合使用,这样就可以完成这项工作,但我不知道该怎么做。谢谢指教!
解决方案
它会是这样的:(编辑:缓存属性信息,而不是在每个 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() 实现应该很快。
推荐阅读
- python - 有没有办法根据特定列的值剪辑整行?
- sql - 我需要用 ms sql 请求中的字符串格式替换值 NULL
- project-reactor - Resilience4j 速率限制器在项目反应堆中无法正常工作?
- matlab - 函数rand和randn的随机数分布
- python - 如何创建将并行接受多个请求的 HTTP Azure 函数?
- php - 仅当字段不为空时才附加逗号
- python - 使用 Django REST 框架 SearchFilter 解码(和等同)特殊字符?
- react-native - 在异步存储中存储访问令牌的安全风险
- json - ts-loader 在导入 .json 文件时在子目录中输出声明文件
- python - 将字符串列表拆分为“相似字符串”组