2015-07-03 45 views
-1

我知道,現在在C#3.0中,我們可以使用動態關鍵字在運行時添加/刪除屬性,如Object作爲一般容器的JavaScript概念,但我有一個問題。動態關鍵字與ExpandoObject附加和刪除屬性

是不是真的擴大了我想要的類型的對象?

例如: 我們有類:

class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set;} 
} 

我將創建一個從Person類一個新的對象:

 dynamic p = new ExpandoObject(); 

現在是該對象確實類Person的對象?它不再與Person類有關?

Console.WriteLine(p.GetType()); // System.Dynamic.ExpandoObject 

現在我要爲屬性設置的值,並擴大與新的屬性「富」的對象號碼:

 p.Age = 25; 
     p.Foo = "foo"; 

我連着財產「時代」的新屬性「富」和設定值,但我做的對於System.Dynamic.ExpandoObject類型的對象不Person型的,所以我有錯配的這一部分,是我真正從我所需要的類型展開對象,我可以用投來指代對象類型這樣的:

Console.WriteLine(((Person)p).Name); 

型 「Microsoft.CSharp.RuntimeBinder.RuntimeBinderException」未處理的異常發生在 System.Core.dll

+0

但它不是'Person' ....它是'ExpandoObject'。僅僅因爲兩個類具有相同的屬性並不能使它們相同。 C#是一種強類型語言。如果你想要一個'人',你爲什麼不創建一個'人'? – Liam

+0

@Liam如果我想將新屬性附加到Person的對象,那麼我想用它作爲Person類型屬性? – Marzouk

+0

那你不行?如果你添加一個屬性給一個人,它不再是一個人了。你可以在Js中,但是Js不是強類型語言 – Liam

回答

1

您不能從動態類型強制轉換爲一種固體型這樣的類型與當時的動態沒有任何關係,除了看起來像它具有相似的屬性。

但是,您可以序列化動態實例,然後將其反序列化爲您擁有的實體類型。我不知道你爲什麼要這樣做,但...

+0

我想知道在C#中使用動態類型的最佳做法,許多開發人員告訴我,在C#中我可以從特定類型附加/刪除屬性,所以我會盡力做到這一點 – Marzouk

2

我認爲你混淆了鑄造和轉換這裏的問題。

  • 鑄造:改變指向 一個對象的引用的類型的行爲。任一者或上下移動的對象分層結構或一個 實現的接口

  • 轉換:創建從 不同類型的原始源對象的新對象,並通過於該類型的引用訪問它。

它通常很難知道在C# 2之間的區別,因爲兩者都使用相同的C#操作:演員。

在這種情況下,你幾乎肯定不會尋找演員陣容。將動態投射到另一個動態本質上是一種身份轉換。它沒有提供任何價值,因爲您只是將動態引用返回到同一個底層對象。由此產生的查找將沒有什麼不同。

而不是你在這種情況下想要的是一個轉換。這是將底層對象變形爲不同類型並以動態方式訪問生成的對象。最好的API是Convert.ChangeType

public static dynamic Convert(dynamic source, Type dest) { 
    return Convert.ChangeType(source, dest); 
} 

在這種情況下,而不是:

Console.WriteLine(((Person)p).Name); 

嘗試:

Console.WriteLine(ConvertTo<Person>(p).Name); 

如果你想我可以寫ConvertTo<T>聲明,並在這裏解釋。