2011-06-15 77 views
0

我怎樣才能返回IEnumerable的從一個方法。返回IEnumerable的<dynamic>從方法

public IEnumerable<dynamic> GetMenuItems() 
     { 

      dynamic menuItems = new[] 
            { 
             new { Title="Home" }, 
            new { Title = "Categories"} 
            }; 

      return menuItems; 

     } 

上述代碼返回IEnumerable,但是當我在View中使用它時,它無法識別Title屬性。

@foreach(var item in @Model) 
{ 
    <span>item.Title</span> 
} 
+2

只是好奇。爲什麼菜單必須是動態的?我知道一些原因,但我很好奇它爲什麼會出現在你的應用程序中。 – 2011-06-15 20:02:04

+4

他使用'dynamic'爲了在當前方法外面顯示匿名類型。這是一個巨大的代碼氣味,應該始終避免。只需創建一個適當的類型。 – 2011-06-15 20:05:44

+0

我可以創建一個Menu類,它將代表一個菜單,但對於我的應用程序,菜單項固定爲5,所以我不想執行額外的工作來爲Menu創建單獨的類。 – johndoe 2011-06-15 20:08:00

回答

8

不要這樣做。

如果需要使用匿名類型的結果創建它的方法之外,現在是時候來定義一個具體類型。

class Foo 
{ 
    public string Bar { get; set; } 
} 

這樣做的缺點是,您可以返回一個Tuple<>對象序列。

匿名類型是當你在做的方法中的一些處理好的,你需要數據的投射,不符合現有的對象圖,而你並不需要暴露這樣的投影到外世界。一旦你開始通過這個投影,繼續並花費額外的時間來定義一個合適的類型,並享受它的好處。未來你會感謝你。

+0

這是否意味着我無法訪問當前方法之外的匿名類型屬性? – johndoe 2011-06-15 20:12:10

+1

@john,有*黑客*,可以讓你做到這一點。這不會讓這些黑客成爲一個好主意!建立一個只封裝數據的類並不需要很長時間,然後花時間去做。當你需要在應用程序中傳遞數據時,你確實需要繼續並創建一個自我記錄的封裝數據類型。 – 2011-06-15 20:15:17

+0

@AnthonyPegram那麼你在說什麼黑客?小心分享?我真的很感興趣你可能會提出什麼 – Sung 2012-06-21 00:58:22

0

匿名類型標記內部,所以你不能從一個不同的組件訪問它們。您可以使用ExpandoObject,但默認的創建語法不適用內聯,這可能很煩人。但是,開源框架impromptu-interface的語法爲creating it inline

using ImpromptuInterface.Dynamic; 
using System.Dynamic; 
... 
public IEnumerable<dynamic> GetMenuItems() 
    { 
     var @new = Builder.New<ExpandoObject>(); 

     dynamic menuItems = new[]{ 
        @new.Object(Title:"Home"), 
        @new.Object(Title:"Categories") 
       }; 

     return menuItems; 

    } 
相關問題