什么是ExpandoObject的真正好处?什么是ExpandoObject的真正好处?(What

2019-05-08 15:35发布

所述ExpandoObject类被添加到.NET 4允许任意地设定属性到在运行时的对象。

是否有过使用任何优势,这个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而不是只使用一个任意字典类型,比您使用的类型是怎么回事在运行时被确定不是很明显其他获得。

Answer 1:

自从我写你指的是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);
   }
}


Answer 2:

一个优点是绑定方案。 数据网格和财产电网将拿起通过TypeDescriptor系统的动态特性。 此外,WPF数据绑定将了解动态属性,因此WPF控件可以更容易地结合到ExpandoObject比字典。

互操作性与动态语言,这将是期待DLR特性,而不是字典条目,也可能在某些情况下考虑。



Answer 3:

对我来说,真正受益的是完全不费力的数据从XAML绑定:

public dynamic SomeData { get; set; }

...

SomeData.WhatEver = "Yo Man!";

...

 <TextBlock Text="{Binding SomeData.WhatEver}" />


Answer 4:

互操作与建立在其他语言的DLR是#1的原因,我能想到的。 你可以不通过他们Dictionary<string, object> ,因为它不是一个IDynamicMetaObjectProvider 。 另一个好处是,它实现INotifyPropertyChanged ,这意味着在WPF的数据绑定世界里还增加超出了好处Dictionary<K,V>可以为您提供。



Answer 5:

这是所有关于程序员的方便。 我可以想像写作与此对象潦潦草草的程序。



Answer 6:

我认为这将有句法受益,因为你不再被使用字典“伪造”动态添加属性。

也就是说,和互操作动态语言,我觉得。



Answer 7:

这是例如,从伟大的MSDN文章有关使用ExpandoObject用于创建动态的ad-hoc类型传入的结构化数据(如XML,JSON)。

我们也可以指定委托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知道。



Answer 8:

有些情况下,这是很方便的。 我会用它例如模块化外壳。 每个模块定义了它自己的配置对话框databinded到它的设置。 我为它提供ExpandoObject因为它的DataContext并保存在我的配置存储的值。 这样的配置对话框作家只是必须绑定到一个值,它会自动创建并保存。 (并且提供给模块当然使用这些设置)

它只是比字典更容易使用。 但每个人都应该知道,在内部它仅仅是一个字典。

这就像LINQ只是语法糖,但它使事情变得更容易,有时。

因此,要直接回答你的问题:这是比较容易写,更容易阅读。 但在技术上它本质上是一个Dictionary<string,object> (你甚至可以将它转换成一个列出的数值)。



Answer 9:

var obj = new Dictionary<string, object>;
...
Console.WriteLine(obj["MyString"]);

我认为只有工作,因为任何事物都有一个ToString(),否则你必须知道,这是和投的“对象”到该类型的类型。


其中有些是有用的频率高于其他,我想彻底。

  1. 这可能是更自然地访问集合,在这种情况下,什么是一个有效的“字典”,用更直接点符号。

  2. 看来,如果这可以作为一个非常好的元组。 你还可以打电话给你的成员“项目1”,“项目2”等等......但现在你不就得了,这也是可变的,不像一个元组。 这确实有不足的IntelliSense支持的巨大缺陷。

  3. 你可能会与“成员名称作为字符串”不舒服,如同字典中的感觉,你可能会觉得它太像“执行字符串”,并有可能导致命名约定在获得编码,处理与语素工作,音节当代码试图了解如何使用会员:-P

  4. 您可以分配一个值的ExpandoObject本身或只是它的成员? 比较和动态/动态[],无论使用哪一个最适合您需要的对比。

  5. 我不认为在foreach循环动态/动态[]的作品,你必须使用VAR,但可能你可以使用ExpandoObject。

  6. 你不能在一个类中使用动态的数据成员,也许是因为它至少有点像一个关键词,希望你可以与ExpandoObject。

  7. 我希望它“是”一个ExpandoObject,可能是除了标签非常通用的有用的东西,以区别于基于类型,其中有大量的动态的东西正在使用的代码。


是很好,如果你可以一次向下钻取多个级别。

var e = new ExpandoObject();
e.position.x = 5;
etc...

那可能不是最好的例子,试想在自己的项目优雅用途适当。

这是一个耻辱,你不能有代码生成其中的一些,结果推智能感知。 我不知道如何做到这一点的工作,虽然。

是很好,如果他们能有一个价值,以及为成员。

var fifteen = new ExpandoObject();
fifteen = 15;
fifteen.tens = 1;
fifteen.units = 5;
fifteen.ToString() = "fifteen";
etc...


Answer 10:

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

除了与元组语法你有强大的类型推断和intlisense支持



文章来源: What are the true benefits of ExpandoObject?