从方法</dynamic>返回IEnumerable <dynamic>

时间:2011-06-15 19:54:59

标签: c# asp.net-mvc c#-4.0

如何从方法返回IEnumerable。

 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 个答案:

答案 0 :(得分:9)

不要这样做。

如果需要在创建它的方法之外使用匿名类型的结果,则可以定义具体类型。

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

如果不这样做,您可以返回一系列Tuple<>个对象。

当您在方法内部进行某些处理时,匿名类型很好,您需要投影不符合现有对象图的数据,并且您不需要向外界公开这样的投影。一旦你开始传递这个预测,继续前进并花费额外的时间来定义一个合适的类型并享受它的好处。未来你会感谢你。

答案 1 :(得分: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; 

   }