ExpandoObject的真正好处是什么?
被添加到.NET 4的ExpandoObject类允许您在运行时任意设置属性到对象上。
使用Dictionary<string,object>
或甚至是一个Hashtable有没有什么优势? 据我所知,这只不过是一个散列表,你可以用更简洁的语法来访问它。
例如,为什么是这样的:
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而不是仅仅使用任意字典类型会带来什么真正的好处,除了不明显的是您使用的是将在运行时确定的类型。
由于我写了你指的MSDN文章,我想我必须回答这个问题。
首先,我预见到了这个问题,这就是为什么我写了一篇博客文章,其中展示了ExpandoObject的一个或多或少的真实用例:C#4.0中的动态:介绍ExpandoObject。
不久之后,ExpandoObject可以帮助您创建复杂的分层对象。 例如,假设在字典中有一本字典:
Dictionary<String, object> dict = new Dictionary<string, object>();
Dictionary<String, object> address = new Dictionary<string,object>();
dict["Address"] = address;
address["State"] = "WA";
Console.WriteLine(((Dictionary<string,object>)dict["Address"])["State"]);
层次越深,丑陋就是代码。 借助ExpandoObject,它保持优雅和可读性。
dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);
其次,正如已经指出的那样,ExpandoObject实现了INotifyPropertyChanged接口,它使您能够比字典更好地控制属性。
最后,您可以像这样将事件添加到ExpandoObject:
class Program
{
static void Main(string[] args)
{
dynamic d = new ExpandoObject();
// Initialize the event to null (meaning no handlers)
d.MyEvent = null;
// Add some handlers
d.MyEvent += new EventHandler(OnMyEvent);
d.MyEvent += new EventHandler(OnMyEvent2);
// Fire the event
EventHandler e = d.MyEvent;
if (e != null)
{
e(d, new EventArgs());
}
// We could also fire it with...
// d.MyEvent(d, new EventArgs());
// ...if we knew for sure that the event is non-null.
}
static void OnMyEvent(object sender, EventArgs e)
{
Console.WriteLine("OnMyEvent fired by: {0}", sender);
}
static void OnMyEvent2(object sender, EventArgs e)
{
Console.WriteLine("OnMyEvent2 fired by: {0}", sender);
}
}
一个优点是绑定方案。 数据网格和属性网格将通过TypeDescriptor系统获取动态属性。 另外,WPF数据绑定将理解动态属性,因此WPF控件可以比字典更容易绑定到ExpandoObject。
在某些情况下,动态语言的互操作性也可能是一个考虑因素,而动态语言会期待DLR属性而不是字典条目。
对我来说真正的好处是XAML完全不费吹灰之力的数据绑定:
public dynamic SomeData { get; set; }
...
SomeData.WhatEver = "Yo Man!";
...
<TextBlock Text="{Binding SomeData.WhatEver}" />
链接地址: http://www.djcxy.com/p/14363.html