.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的实际用例:Dynamic in C# 4.0: Introducing the 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接口(interface),与字典相比,它对属性的控制更多。

最后,您可以将事件添加到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;

       e?.Invoke(d, new EventArgs());
   }

   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);
   }
}

另外,请记住,没有什么可以阻止您以动态方式接受事件参数。换句话说,可以使用EventHandler而不是EventHandler<dynamic>,它会导致处理程序的第二个参数为dynamic

关于c# - ExpandoObject的真正好处是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1653046/

10-11 11:45