DisplayNameFor用于从IEnumerable <t> </t>派生的接口

时间:2014-12-10 08:32:30

标签: c# asp.net asp.net-mvc razor asp.net-mvc-5

当我宣布HtmlHelper<T>.DisplayNameFor()作为视图模型时,

IEnumerable<T>完美无瑕地运行,为我提供了对实际类型模型等的智能感知支持。

@model IEnumerable<MyModel>

// e.g. for <th>
@Html.DisplayNameFor(model => model.Id)

但是,当我声明源自IEnumerable<T>的自定义类型时,它会突然停止工作。

@model IPagedList<MyModel>

@Html.DisplayNameFor(model => model.Id) // Cannot resolve symbol 'Id'

IPagedList<T>是:

public interface IPagedList<T> : IEnumerable<T> {}

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

这就是C#中重载解析的工作原理。给定

public static void DoSomething<T>(T t)
{ }

public static void DoSomething<T>(IEnumerable<T> t)
{ }

然后DoSomething(new int[0])将使用T调用T = int[]重载,而使用IEnumerable<T>调用T = int重载。

这是因为&#34;转换&#34;从int[]T是&#34;更好&#34;在前一种情况下(T = int[]int[]转换为IEnumerable<T>在后​​一种情况下(T = int)。(见7.5.3.2 Better function member和{{1}在C#规范中。)

我认为您现在唯一的选择是使用7.5.3.3 7.5.3.3 Better conversion from expression来指定您正在访问模型的元素:

.First()