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

时间:2014-09-23 20:37:18

标签: c# asp.net-mvc

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

控制器中的代码如下。

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>具有动态性有关,但有人可以详细说明吗?

1 个答案:

答案 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..
}