gpt4 book ai didi

c# - DisplayNameFor 用于派生自 IEnumerable 的接口(interface)

转载 作者:行者123 更新时间:2023-11-30 20:46:07 24 4
gpt4 key购买 nike

HtmlHelper<T>.DisplayNameFor()当我声明一个 IEnumerable<T> 时完美地工作作为 View 模型,为我提供对实际类型化模型等的智能感知支持。

@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> {}

有什么办法可以解决吗?

最佳答案

这就是重载解析在 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 .

这是因为 int[] 的“转换”至 T在前一种情况下“更好”(其中 T = int[] 比在后一种情况下从 int[]IEnumerable<T> 的转换(其中 T = int )。(参见 C# 规范中的 7.5.3.2 Better function member7.5.3.3 7.5.3.3 Better conversion from expression。)

我认为你现在唯一的选择是使用 .First()为了指定您正在访问模型的元素:

@Html.DisplayNameFor(model => model.First().Id)

关于c# - DisplayNameFor 用于派生自 IEnumerable<T> 的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27396383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com