被添加到. net 4中的ExpandoObject类允许您在运行时任意地为对象设置属性。

与使用Dictionary<string, object>,甚至哈希表相比,这有什么优点吗?据我所知,这只是一个哈希表,您可以使用稍微简洁的语法访问它。

举个例子,为什么是这样:

dynamic obj = new ExpandoObject();
obj.MyInt = 3;
obj.MyString = "Foo";
Console.WriteLine(obj.MyString);

比:更好的或有本质区别的:

var obj = new Dictionary<string, object>();
obj["MyInt"] = 3;
obj["MyString"] = "Foo";

Console.WriteLine(obj["MyString"]);

使用ExpandoObject而不是使用任意的字典类型有什么真正的好处,除了不明显地表明您使用的是将在运行时确定的类型。


当前回答

对我来说,真正的好处是完全不费力的XAML数据绑定:

public dynamic SomeData { get; set; }

...

SomeData.WhatEver = "Yo Man!";

...

 <TextBlock Text="{Binding SomeData.WhatEver}" />

其他回答

这完全是为了方便程序员。我可以想象用这个对象编写快速而肮脏的程序。

一个优点是用于绑定场景。数据网格和属性网格将通过TypeDescriptor系统获取动态属性。此外,WPF数据绑定将理解动态属性,因此WPF控件可以比字典更容易地绑定到ExpandoObject。

与动态语言的互操作性(期望使用DLR属性而不是字典条目)在某些场景中也可能需要考虑。

对我来说,真正的好处是完全不费力的XAML数据绑定:

public dynamic SomeData { get; set; }

...

SomeData.WhatEver = "Yo Man!";

...

 <TextBlock Text="{Binding SomeData.WhatEver}" />

在某些情况下,这很方便。例如,我将把它用于模块化shell。每个模块都定义了自己的配置对话框,该对话框与它的设置绑定。我为它提供了一个ExpandoObject,因为它是Datacontext,并将值保存在我的配置存储。这样,配置对话框编写者只需要绑定到一个值,它就会自动创建和保存。(当然,提供给模块用于使用这些设置)

它只是比字典更容易使用。但每个人都应该意识到,在内部它只是一本词典。

就像LINQ只是语法糖一样,但有时它让事情变得更简单。

所以直接回答你的问题:它更容易写,也更容易读。但从技术上讲,它本质上是Dictionary<string,对象>(您甚至可以将其转换为一个以列出值)。

与基于DLR的其他语言进行互操作是我能想到的首要原因。你不能给他们传递Dictionary<string对象>,因为它不是IDynamicMetaObjectProvider。另一个额外的好处是它实现了INotifyPropertyChanged,这意味着在WPF的数据绑定世界中,它还具有Dictionary<K,V>所能提供的额外好处。