2010-08-22 42 views
43

我正試圖學習C#4.0附帶的所有新東西。我無法理解DynamicObjectExpandoObject類型之間的差異。看起來好像使用DynamicObject,例如,當您想要訪問Python腳本中的變量時和ExpandoObject與COM/Office對象交談時。我對嗎?它們的用途有什麼不同?C#4.0 Dynamic vs Expando ...它們在哪裏適合?

+2

更好的答案在這裏:http://stackoverflow.com/questions/3565481/differences-between-expandoobject-dynamicobject-and-dynamic – 2014-03-01 22:56:10

回答

86

Expando 是一個dynamic類型的成員可以在運行時添加(或刪除)。 dynamic旨在允許.NET在與動態類型語言(如Python和JavaScript)接口時與類型進行互操作。

所以,如果你需要處理動態類型:使用dynamic,如果你需要處理動態數據,比如XML或JSON:使用ExpandoObject

在Expando的聲明顯示動態和的expando之間的關係:

dynamic expando = new ExpandoObject(); 

,並增加了新的特性的能力:

expando.SomeNewStringVal = "Hello World!"; 

這代碼最後一行創建了一個全新的串親在expando對象中稱爲SomeNewStringVal。字符串類型是從作業中推斷出來的。

因此,expando是一種動態數據類型,它可以表示動態變化的數據。簡而言之,就是這樣。 Here's a deeper look at dynamic and expando

完整的示例:

using System; 
using System.Dynamic; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     dynamic expando = new ExpandoObject(); 
     expando.SomeNewStringVal = "Hello Brave New Whirrled!"; 
     Console.WriteLine(expando.SomeNewStringVal); 

     // more expando coolness/weirdness: 
     var p = expando as IDictionary<String, object>; 
     p["A"] = "New val 1"; 
     p["B"] = "New val 2"; 

     Console.WriteLine(expando.A); 
     Console.WriteLine(expando.B); 
    } 
} 
+5

雖然他已經接受了它,我認爲OP意味着DynamicObject和ExpandoObject的區別。 – nawfal 2015-07-30 06:46:56

+1

只是爲了說明這一點在現實世界中確實派上用場。我只是在序列化爲xml或json之前使用它來創建dyanmic響應對象。這樣我可以遞歸地添加具有不同屬性名稱的子類,而無需定義大量的顯式屬性。 「GroupsL1」:[{「GroupingL2 :: [{... – user2326106 2016-07-20 16:09:39

+0

['DynamicObject'](https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework- MSDN:*提供了一個在運行時指定動態行爲的基類,這個類必須是繼承的;你不能直接實例化它* MSDN頁面包含一個基於'DynamicObject'的簡化'ExpandoObject'實現因此,這兩種類型都用於後期綁定,但「ExpandoObject」是具體的(並且是封閉的),而「DynamicObject」只是自定義動態對象的基類。 – Palec 2017-08-26 19:26:31