C# 从方法返回IEnumerable
如何从方法返回IEnumerableC# 从方法返回IEnumerable,c#,asp.net-mvc,c#-4.0,C#,Asp.net Mvc,C# 4.0,如何从方法返回IEnumerable public IEnumerable<dynamic> GetMenuItems() { dynamic menuItems = new[] { new { Title="Home" },
public IEnumerable<dynamic> GetMenuItems()
{
dynamic menuItems = new[]
{
new { Title="Home" },
new { Title = "Categories"}
};
return menuItems;
}
上面的代码返回IEnumerable,但当我在视图中使用它时,它无法识别Title属性
@foreach(var item in @Model)
{
<span>item.Title</span>
}
不要这样做
如果您需要在创建匿名类型的方法之外使用该匿名类型的结果,那么是时候定义一个具体类型了
class Foo
{
public string Bar { get; set; }
}
如果不这样做,您可以返回一个元组对象序列
当您在方法内部执行某些处理时,匿名类型很好,您需要一个不符合现有对象图的数据投影,并且不需要将这样的投影公开给外部世界。一旦你开始传递这个投影,就开始吧,花额外的时间定义一个合适的类型并享受它的好处。将来您会感谢您。匿名类型被标记为内部,因此您无法从其他程序集访问它们。您可以使用ExpandoObject,尽管默认的创建语法不能内联工作,这可能会很烦人。但是,开源框架有一个用于的语法
只是好奇。为什么菜单必须是动态的?我知道一些原因,但我很好奇为什么会出现在你的应用程序中。他使用dynamic是为了在当前方法之外显示匿名类型。这是一种巨大的代码气味,应始终避免。只需创建一个适当的类型。我可以创建一个表示菜单的菜单类,但对于我的应用程序,菜单项固定为5,因此我不想执行额外的工作来为菜单创建单独的类。然后只需使用元组而不是匿名类型,您的问题就得到了解决。尝试使其工作,包括在上发布时间,这样可以解决问题比实现一个合适的类型花费更多的时间。一个合适的类型也会给你的模板。还有一些内置类型,如Tuple、KeyValuePair string、url,我猜它们在这种情况下可以很好地使用。这是否意味着我无法访问当前方法之外的匿名类型属性?@john,有些黑客可以让你这样做。那可不是什么好主意!构建一个只封装数据的类并不需要很长时间,继续并花费时间来完成。当您需要在应用程序中传递数据时,您确实需要继续创建一个自文档化、封装的数据类型。@AnthonyPegram那么您所说的hack是什么呢?愿意分享吗?我真的很想知道你会想出什么主意
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;
}