Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中重写ExpandooObject的ToString()#_C#_Dynamic_Expandoobject - Fatal编程技术网

C# 如何在C中重写ExpandooObject的ToString()#

C# 如何在C中重写ExpandooObject的ToString()#,c#,dynamic,expandoobject,C#,Dynamic,Expandoobject,ExpandoObject是密封的,不能直接继承 EDIT2:为什么我使用ExpandoObject而不是dynamicbject,因为ExpandoObject实现了INotifyPropertyChanged,这在WPF中是受支持的。在wpf中,控件将调用System.Object中提到的隐式ToString,因此是否可以覆盖的System.Object.ToString() 感谢并为@Los Frijoles道歉,我之前没有很好地表达我的问题。我不知道“优雅”这个词,但你可以试试这个: p

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

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

感谢并为@Los Frijoles道歉,我之前没有很好地表达我的问题。

我不知道“优雅”这个词,但你可以试试这个:

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”功能:


这超出了作者要求的范围,但我想我会将其包括在内,以供稍后查看此答案的人使用。

你的意思是什么,但这将失去“动态”的感觉?如果我有10种不同的实例,并且每种ToString()可能需要不同的实现,那么我需要创建10个子类@Sriram Sakthivel如果打印对象,它是否会隐式调用?否。如果对象被强制转换为
System.object
(这是简单打印时发生的情况),则将执行
expandooobject
本机的
ToString
方法,而不是执行属性查找并获取新方法委托。通过显式调用
ToString
,编译器知道它是
动态的
,它首先执行属性查找。如果你想让它隐式地工作,我猜(这是一个猜测)一个人需要在子类中重写
ToString
,我看不到解决这个问题的方法。我对
dynamic
的了解还不够深入。谢谢,你的答案有效,我犯了一个错误:
ExpandoObject
是密封的,无法扩展。PS:我们还可以将ToString Func的委托更改为
Func()
DyamicObject
可以扩展,如果您选择扩展路径,它就是您想要使用的类。否。我需要
ExpandoObject
,cz它实现了
INotifyPropertyChanged