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

上一篇: What are the true benefits of ExpandoObject?

下一篇: Protect .NET code from reverse engineering?