使用 IEnumerable<> 作为列表<>当动态时

本文关键字:动态 列表 IEnumerable 使用 | 更新日期: 2023-09-27 18:24:11

我正在看一些非常有趣的代码。我试图理解它为什么有效。

控制器中的代码如下。

var paymentInfo = controllerService.GetPaymentSummary();
ViewBag.PaymentInfo = paymentInfo;

在控制器服务类中,有此代码。

public IEnumerable<SomeType> GetPaymentSummary()
{
    // ...
    return paymentInfo; // is of type List<SomeType>
}

在视图中,有这个非常有趣的代码。

@if (ViewBag.PaymentInfo.Count > 0)
{
    // do something..
}

视图使用属于List<T> Count属性。这怎么可能?

例如,在控制器中,我无法写入paymentInfo.Count paymentInfo因为 IEnumerable<SomeType> 类型

我知道这与ViewBag动态有关,但有人可以详细说明吗?

使用 IEnumerable<> 作为列表<>当动态时

(可以这样想:

IEnumerable只是一个协定,说明方法的返回值(即paymentInfo(必须具有的某些要求。

paymentInfo实际上是什么,是一个List。由于List实现了IEnumerable,它也可以表现为并被视为IEnumerable,但它的运行时类型仍然是List

使用 Dynamic 时,重要的不是指定的返回类型 (IEnumerable (,而是实际的对象;检查的只是">这个对象是否包含成员Count",并且由于List有一个Count,这很好。

当然,如果GetPaymentSummary()在某个时候发生了变化,并返回不包含Count成员的其他IEnumerable实现,则代码可能会中断。

在下面的评论中反馈后更新:

您可以通过改用.Any()来避免这种情况:

@if (ViewBag.PaymentInfo.Any() > 0) 
{
    // do something..
}

这应该可以正常工作,因为.Any()是在IEnumerable中声明的,而不仅仅是在List中。