2014-02-21 95 views
2

我發現的每個答案都依賴於最初是一個類型化對象的匿名對象。我有一個初始化爲return new {x, y, width, height, guid}的對象,我想獲得​​(然後我將使用它來獲取原始/完整對象)。從一直匿名的對象中提取單個屬性?

private void ListboxContainer_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    object selected = e.AddedItems[0]; 
    selectedObjectText.Text = e.AddedItems[0].ToString(); 

    Console.WriteLine(selected.ToString()); 
    // -> "{ type = tableBlock, x = 100, y = 100, width = 300, height = 50, z = 50, guid = 0f179336-3b38-4e36-94b7-671ffd8017d9 }" 

    Console.WriteLine(selected.GetType().ToString()); 
    // -> "<>f__AnonymousType2`7[System.String,System.Double,System.Double,System.Double,System.Double,System.Int32,System.String]" 

    dynamic d = selected; 

    Console.WriteLine("guid: " + d.guid); 
    // -> RuntimeBinderException: 'object' does not contain a definition for 'guid' 

    // What I eventually need to do: 
    //IDrawable selected = activeMap.GetDrawable(e.AddedItems[0].guid); 
} 

我正在尋找一個更安全/更高性能的方式來獲得的GUID(我知道有)比手動分析它的字符串。要了解更多關於這之前發生的事情的信息,請查看this的帖子(很遺憾,這被遺漏了,所以這整個帖子只是一個解決辦法)。

感謝您的幫助!

回答

3

如果您將匿名對象返回給動態,則可以在運行時調用該屬性,但如果該屬性不存在,則會引發運行時錯誤。

public dynamic Test() 
{ 
    return new {var1 = "", var2 = Guid.NewGuid()}; 
} 

var output = Test(); 
Console.WriteLine(output.var2); 

問題是,你爲什麼要這樣做?你是否有任何理由不能僅僅從開始就返回新的對象?雖然你可以訪問動態屬性,但這有點危險,不像性能高,顯然不安全。

+0

我工作的一個程序,行將'ZoomableCanvas',通過'ItemsSource'餵養,需要一個通用對象。出於某種原因,當我將一個完整的對象從(例如)TableBlock上傳到一個對象時,它無法工作,但是如果我通過'return new {param1,param2}手動創建一個通用對象;'它可以正常工作。此SO帖子中的代碼位於SelectionChanged監聽器中。我會用完整的方法更新這篇文章。其他SO帖子關於打字問題(這似乎已經通過了SO):http://stackoverflow.com/questions/21896754/supplying-typed-objects-to-zoomablecanvas – Benjin

+0

//我最終需要做的事情: // IDrawable selected = activeMap.GetDrawable(e.AddedItems [0] .guid);.這個評論對我來說很麻煩。您正在訪問此時添加的e項。這不是一個動態的。如果你在運行時檢查e.AddedItems [0],它是什麼類型的?我懷疑這是一個對象,而不是動態的,這會導致你的問題。您目前在您的問題中所評論的代碼不會拋出錯誤。 –

+0

我只是跟着各種各樣的其他SO帖子,說動態打字是在.net 4.0中的方式。當我打印'e.AddedItems [0] .GetType()',我得到「<> f__AnonymousType2'7 [System.String,System.Double,System.Double,System.Double,System.Double,System.Int32,System 。串]」。當我設置一個斷點時,我得到這個:http://i.imgur.com/cHwiOmF.png。它看起來沒有類型。 – Benjin

0

這非常相同的代碼在這裏運行的罰款(沒有這樣的「'object' does not contain a definition for 'guid'」錯誤):

object o = 
    new 
     { 
      type = "tableBlock", 
      x = 100, 
      y = 100, 
      width = 300, 
      height = 50, 
      z = 50, 
      guid = Guid.Parse("6d405dcf-9f40-4b2c-8a26-588259aee557") 
     }; 
Console.WriteLine(o.ToString()); 
dynamic d = o; 
Console.WriteLine("guid: " + d.guid); 
+1

我刪除了我原來的評論,因爲當我第一次閱讀你的文章時,我確實發生了錯誤。您仍然將d作爲動態訪問,而不是匿名類型,如果您處於方法上下文內部或外部,這並不會產生影響。如果它是一個匿名類型,它將在訪問類型方面有所不同,而不是值。道歉造成混亂:)。 –

+0

我剛剛更新了關於對象上下文的更多信息。也許你會發現一些新的東西? – Benjin

+0

不幸的是,不。這並沒有改變我沒有得到你所質疑的錯誤的事實。正如你上面看到的,我創建了一個匿名對象,將它作爲類型對象傳遞給dynamic類型的變量。那我可以訪問'guid'屬性而不會出錯?目前我無法複製這個問題。 – har07

相關問題