ExpandoObject的真正好处是什么?

添加到.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而不是只使用一个任意字典类型,比不是很明显,您使用的类型是怎么回事在运行时确定的其他获得。

回答:

自从我写了您所指的MSDN文章以来,我想我必须回答这一问题。

首先,我预料到了这个问题,这就是为什么我写了一篇博客文章,该文章或多或少显示了ExpandoObject的实际用例:C#4.0中的Dynamic: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;

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

以上是 ExpandoObject的真正好处是什么? 的全部内容, 来源链接: utcz.com/qa/419680.html

回到顶部