能否不重写Record的ToString()仅自定义单个成员的输出?
解决方案
目前C#原生没有提供类似JSON转换器的属性来单独指定某个成员的ToString()逻辑,但可以通过以下几种简便方式,在复用record自动生成的ToString()基础上,仅自定义数组成员的输出,无需完全重写所有逻辑:
方案1:给数组元素的Record类型重写ToString(针对自定义Record数组场景)
如果数组是自定义Record类型,先给该元素Record重写ToString(),再在主Record的ToString()中复用自动生成内容并替换数组部分:
using System; using System.Linq; public class Program { public static void Main() { var items = new[] { new MyItem("a"), new MyItem("b"), new MyItem("c") }; Console.WriteLine(new Test(items)); } } // 自定义数组元素的Record,重写ToString实现自定义输出 record MyItem(string Value) { public override string ToString() => $"\"{Value}\""; } // 主Record,复用自动生成的ToString并替换数组内容 record Test(MyItem[] Items) { public override string ToString() { var baseToString = base.ToString(); var formattedArray = $"{{{string.Join(", ", Items)}}}"; return baseToString.Replace("MyItem[]", formattedArray); } }
输出:
Test { Items = {"a", "b", "c"} }
方案2:包装数组类型(针对string[]或无法修改元素类型的场景)
创建一个数组包装类,重写其ToString()来格式化数组内容,主Record中使用包装类替代原数组类型:
using System; using System.Linq; public class Program { public static void Main() { Console.WriteLine(new Test(new FormattableArray<string>("a", "b", "c"))); } } // 数组包装类,负责格式化数组的ToString输出 public class FormattableArray<T> { public T[] Items { get; } public FormattableArray(params T[] items) => Items = items; public override string ToString() { var elementStrings = Items.Select(item => item is string str ? $"\"{str}\"" : item?.ToString() ?? "null"); return $"{{{string.Join(", ", elementStrings)}}}"; } } // 主Record直接使用包装类 record Test(FormattableArray<string> Strings);
输出:
Test { Strings = {"a", "b", "c"} }
方案3:复用自动ToString并替换数组部分(快速适配场景)
直接调用base.ToString()获取自动生成的内容,再替换其中的数组类型名字段,这种方式依赖于record自动ToString的格式(类型名 { 成员名 = 成员值, ... }),适合快速适配简单场景:
using System; using System.Linq; public class Program { public static void Main() { Console.WriteLine(new Test("a", "b", "c")); } } record Test(params string[] Strings) { public override string ToString() { var baseStr = base.ToString(); var arrayContent = string.Join(", ", Strings.Select(s => $"\"{s}\"")); return baseStr.Replace("System.String[]", $"{{{arrayContent}}}"); } }
输出:
Test { Strings = {"a", "b", "c"} }
内容的提问来源于stack exchange,提问作者Sinatr
相关产品推荐
相关产品推荐

