You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当方法被可调用属性遮蔽时,如何调用该方法?

匿名类型自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:31:13