我正在看一些非常有趣的代碼。我試圖理解它爲什麼起作用。使用IEnumerable <>作爲列表<>時動態
控制器中的代碼如下。
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
是動態的,但有人可能會詳細說明嗎?
嗯,你已經差不多自己說的。 'ViewBag'是'dynamic',所以包含它的表達式往往沒有編譯時類型檢查。相反,它們是動態解析的(基本上是通過反射),因此它們使用相關對象的運行時類型。 – 2014-09-23 20:40:50
謝謝。我嘗試使用反射來獲取返回類型的'GetPaymentSummary()',它是'IEnumerable'。我猜在運行時發生了其他事情,因爲它看起來不同嗎? –
erdinger
2014-09-23 21:00:02
對象的運行時不是返回它的代碼的返回類型。運行時類型由哪個構造函數用來創建該特定對象(在運行時)來確定。因此,運行時類型永遠不是一個接口(比如'IEnumerable')。 – 2014-09-23 21:01:37