2011-06-15 57 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; 

    } 
相关问题