如何在C#类的ToString方法中动态获取所有属性名与值
动态实现包含所有属性的ToString()方法
完全可以在类内部通过反射实现动态获取所有属性名称及其值的ToString()方法,你的代码思路正确,但存在一处小问题需要修正:
在调用prop.GetValue()时,必须传入当前实例对象this,否则会因为缺少目标实例参数抛出异常。
修正后的ToString()方法代码如下:
public override string ToString() { StringBuilder sb = new StringBuilder(); var allProperties = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var prop in allProperties) { // 传入当前实例this获取属性值 var value = prop.GetValue(this); sb.AppendLine($"Sum of {prop.Name} is: {value ?? "null"}"); } return sb.ToString(); }
额外说明
- 反射会产生少量性能开销,在对性能要求极高的场景下需要权衡,但日常业务场景中完全适用。
- 如果需要仅包含当前类(排除基类
ThirdDegree)的属性,可以在获取属性时添加BindingFlags.DeclaredOnly:var allProperties = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); - 可以扩展处理null值、格式化数值等场景,比如上面代码中用
value ?? "null"处理属性值为null的情况。
内容的提问来源于stack exchange,提问作者Dimitar Kazakov
相关产品推荐
相关产品推荐

