2012-11-29 40 views
1

範圍可能不是合適的詞。使用下面的代碼我無法訪問集合元素的對象的屬性。有更好的返回數據類型還是訪問這些屬性的方法?如何訪問其範圍之外的匿名對象的屬性?

protected object Modules() 
{ 
    DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/")); 
    var folders = from x in di.GetDirectories() 
        where 
        !(new string[] { 
         "app_data","bin","obj","scripts","styles","properties" 
         }).Contains<string>(x.Name.ToLower()) 
        select new 
        { 
         Name = x.Name, 
         Path = x.FullName 
        }; 
    return folders 
} 

回答

5

有兩種可行的解決辦法:

  1. 爲它創建一個真正的類。這是首選的解決方案。
  2. 使您的方法返回dynamic而不是object。與此相關的問題是,您會丟失使用此方法結果的代碼的編譯時檢查。
0

改爲使用IEnumerable<dynamic>

根據msdn的說法「動態類型使得它可以在運行時繞過編譯時類型檢查,而是在運行時解析這些操作,動態類型簡化了對COM API的訪問,例如Office自動化API以及動態API(如IronPython庫)和HTML文檔對象模型(DOM)。「

http://msdn.microsoft.com/en-us/library/dd264741.aspx

1

一旦你離開該匿名類型定義的範圍,你必須使用反射來獲取其成員。

我能想到的另外兩個選項是使用動態類型(如果使用4.0框架或更高版本)或創建定義類型而不是匿名類型。

1

我會建議簡單地創建一個傳遞數據的新類型。如果數據範圍受到保護,則可以使用受保護的嵌套子類來防止小數據類的過度擴散。