如何在C#中覆盖ExpandoObject的ToString()

时间:2014-12-29 06:05:11

标签: c# dynamic expandoobject

ExpandoObject 密封,无法直接继承。

EDIT2 :为什么我使用ExpandoObject而不是DynamicObject,因为ExpandoObject已实施 INotifyPropertyChanged , WPF支持。在wpf中,Control会调用System.Object提到的隐式ToString,那么是否可以覆盖{strong> System.Object.ToString()ExpandoObject

对@Los Frijoles表示感谢和抱歉,我以前没有表达过我的问题。

1 个答案:

答案 0 :(得分:1)

我不知道“优雅”,但你总能尝试这个:

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 < / p>

这超出了作者要求的范围,但我想我会把它包含在以后查看此答案的人中。