返回IEnumerable的从方法
问题描述:
我怎样才能返回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>
}
答
不要这样做。。
如果需要使用匿名类型的结果创建它的方法之外,现在是时候来定义一个具体类型。
class Foo
{
public string Bar { get; set; }
}
这样做的缺点是,您可以返回一个Tuple<>
对象序列。
匿名类型是当你在做的方法中的一些处理好的,你需要数据的投射,不符合现有的对象图,而你并不需要暴露这样的投影到外世界。一旦你开始通过这个投影,继续并花费额外的时间来定义一个合适的类型,并享受它的好处。未来你会感谢你。
答
匿名类型标记内部,所以你不能从一个不同的组件访问它们。您可以使用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;
}
只是好奇。为什么菜单必须是动态的?我知道一些原因,但我很好奇它为什么会出现在你的应用程序中。 – 2011-06-15 20:02:04
他使用'dynamic'为了在当前方法外面显示匿名类型。这是一个巨大的代码气味,应该始终避免。只需创建一个适当的类型。 – 2011-06-15 20:05:44
我可以创建一个Menu类,它将代表一个菜单,但对于我的应用程序,菜单项固定为5,所以我不想执行额外的工作来为Menu创建单独的类。 – johndoe 2011-06-15 20:08:00