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