当方法被可调用属性遮蔽时,如何调用该方法?
匿名类型自定义ToString属性后的奇怪输出?我来给你掰扯清楚
先看你贴的代码:
var anonymous = new { ToString = new Func<string>( () => { return "This came from my property.";} ) }; Console.WriteLine(anonymous); Console.WriteLine(anonymous.ToString());
输出确实有点反直觉:
{ ToString = System.Func`1[System.String] }
This came from my property.
这背后其实是C#匿名类型的默认行为和成员绑定规则在起作用:
当你直接传
anonymous给Console.WriteLine时,调用的是编译器为匿名类型自动生成的ToString方法。这个默认方法的逻辑就是把所有属性名和对应值格式化输出——你定义的ToString在这里只是一个普通的属性(类型是Func<string>委托),所以它会把这个委托的类型全名打印出来,也就是你看到的那串长字符。而当你显式写
anonymous.ToString()时,C#的成员查找规则会优先找到你定义的这个ToString属性(因为它是当前实例的成员),然后你后面加的()是在执行这个委托,所以就返回了你写的自定义字符串。要是你没加(),得到的还是那个委托对象本身哦。
那如果想让Console.WriteLine(anonymous)也输出自定义内容呢?可惜匿名类型是编译器自动生成的密封类,你没法手动重写它的ToString方法——它的所有成员都是编译器帮你生成的,你只能定义属性,不能加方法或者重写基类方法。
所以如果需要自定义ToString的行为,更靠谱的做法是用普通类,或者C#9+的记录类型,比如:
var myRecord = new CustomRecord(); Console.WriteLine(myRecord); // 会输出"This came from my property." public record CustomRecord { public override string ToString() => "This came from my property."; }
这样就能达到你想要的效果啦。
内容的提问来源于stack exchange,提问作者John Wu
相关产品推荐
相关产品推荐

