如何阻止对自定义类型调用默认Object.ToString(),让相关代码无法编译?
重构类型时避免隐式调用Object.ToString()的问题
原始代码定义
首先定义Supplier类:
class Supplier { public Supplier(string name) => Name = name; public string Name { get; } }
重构场景与问题代码
原本用string类型表示供应商,现在重构为Supplier类,但过程中可能遗漏修改这类代码:
var supplier = new Supplier("Acme Inc."); Console.WriteLine($"foo bar {supplier}"); // 输出:foo bar Supplier Console.WriteLine($"foo bar {supplier.Name}"); // 输出:foo bar Acme Inc.
问题在于第一行代码仍能正常编译,但由于默认调用Object.ToString()会返回类型名称,导致输出不符合预期的字符串。
解决方案
方案1:强制让问题代码编译失败
如果想在重构阶段强制找出所有直接使用Supplier对象进行字符串转换的代码,可以重写ToString()并标记为错误级别的过时特性:
[Obsolete("请直接使用Supplier.Name属性,避免隐式调用ToString()输出类型名", true)] public override string ToString() => base.ToString();
当代码中出现{supplier}这类隐式调用ToString()的写法时,编译器会直接抛出错误,强制开发者修改代码。
方案2:重写ToString()保证输出正确
如果不需要强制报错,只是想让输出符合预期,直接重写ToString()返回Name属性即可:
public override string ToString() => Name;
这样即使代码中遗漏修改{supplier},也会输出供应商名称而不是类型名。
内容的提问来源于stack exchange,提问作者Kristoffer Jälén
相关产品推荐
相关产品推荐

