如何在 C# 中为 ExpandoObject 重写 ToString()

本文关键字:重写 ToString ExpandoObject 中为 | 更新日期: 2023-09-27 18:35:28

ExpandoObject密封的,不能直接继承。

EDIT2:为什么我使用ExpandoObject而不是DynamicObject,因为ExpandoObject实现了WPF支持的INotifyPropertyChanged。而在 wpf 中,控件将调用System.Object提到的隐式 ToString,那么是否可以覆盖System.Object.ToString() ExpandoObject

谢谢也很抱歉@Los弗里约尔斯,我以前没有很好地表达我的问题。

如何在 C# 中为 ExpandoObject 重写 ToString()

我不知道

"优雅",但您可以随时尝试:

public delegate string ToStringFunc();
public static void Main(string[] args)
{
    dynamic test = new ExpandoObject();
    test.ToString = new ToStringFunc(() =>
        {
            return "Test";
        });
    Console.WriteLine(test.ToString());
}

这只是创建一个名为 ToString 的值,该值恰好是一个函数委托,看起来像ToString函数的正常方法签名。

这避免了需要扩展ExpandoObject等,并且似乎保持了我认为的"动态"感觉,即能够定义对象仅在运行时"显示"的方式。当然,"动态感觉"究竟意味着什么完全是主观的。

编辑

这是一个版本,它将允许使用DynamicObject注释中提到的隐式ToString,但仍允许ExpandoObject给出的部分"Expando"功能 https://gist.github.com/kcuzner/3670e78ae1707a0e959d:

这超出了作者要求的范围,但我想我会把它包括在后面查看这个答案的人身上。