使用 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
只是一个协定,说明方法的返回值(即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
中。