我正在看一些非常有趣的代码。我试图理解它为什么会起作用。
控制器中的代码如下。
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..
}
View使用属于Count
的{{1}}属性。这怎么可能?
例如,在控制器中,我无法编写List<T>
,因为paymentInfo.Count
的类型为paymentInfo
。
我知道这与IEnumerable<SomeType>
具有动态性有关,但有人可以详细说明吗?
答案 0 :(得分:6)
这样想:
IEnumerable
只是一份合同,声明某些要求,即您的方法(即paymentInfo
)的返回值必须具有。
paymentInfo
实际 是List
。由于List
实现IEnumerable
,它也可以表现为IEnumerable
,但它的运行时类型仍为List
。
使用Dynamic
时,重要的不是指定的返回类型(IEnumerable
),而是实际的对象;所有检查的是“此对象是否包含成员Count
?”,并且由于List
具有Count
,因此效果很好。
当然,如果GetPaymentSummary()
在某些时候发生变化,并返回不包含IEnumerable
成员的Count
的其他实现,那么您的代码可能会破裂。
如果你想这样做,你应该可以通过做这样的事情来解决这个问题:
var paymentInfoList = ViewBag.PaymentInfo.ToList(); // IEnumerable to List
@if (paymentInfoList.Count > 0)
{
// do something..
}