被添加到. 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为传入的结构化数据(即XML, Json)创建动态特殊类型的示例。
我们还可以将delegate分配给ExpandoObject的动态属性:
dynamic person = new ExpandoObject();
person.FirstName = "Dino";
person.LastName = "Esposito";
person.GetFullName = (Func<String>)(() => {
return String.Format("{0}, {1}",
person.LastName, person.FirstName);
});
var name = person.GetFullName();
Console.WriteLine(name);
因此,它允许我们在运行时向动态对象注入一些逻辑。
因此,与lambda表达式、闭包、动态关键字和DynamicObject类一起,我们可以在c#代码中引入一些函数式编程的元素,这些元素是我们从动态语言如JavaScript或PHP中了解到的。
在valueTuples之后,ExpandoObject类有什么用?
这6行代码与ExpandoObject:
dynamic T = new ExpandoObject();
T.x = 1;
T.y = 2;
T.z = new ExpandoObject();
T.z.a = 3;
T.b= 4;
可以用元组写在一行中:
var T = (x: 1, y: 2, z: (a: 3, b: 4));
此外,有了元组语法,你就有了强大的类型推断和inlisense支持