gpt4 book ai didi

c# - ExpandoObject 的真正优势是什么?

转载 作者:IT王子 更新时间:2023-10-29 03:27:16 25 4
gpt4 key购买 nike

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

与使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com