2011-07-25 63 views
7

我創建接收數據源DataSet或列表轉換成列表的IEnumerable <T>

我如何轉換IEnumerable的到列表中的CreateChildControls性事件的控制?

protected override int CreateChildControls(IEnumerable dataSource, bool dataBinding) 
{ 
    if (dataSource is System.Data.DataSet) 
    { 
    } 
    else if(dataSource is IList) 
    { 
    } 
} 

回答

12

通常人們會用IEnumerable<T>.ToList() extensionmethod從LINQ的,但在你的情況下,你不能使用它(馬上),因爲你有非通用IEnumerable接口。嗖,你將不得不首先投它(也使用LINQ):

datasource.Cast<object>().ToList(); 

不管你原來的集合實際上IST,這將始終成功。

+0

感謝,我怎麼可以得到原始類型,而不是設置對象類型? – Pablogrind

+0

如果該類型總是相同的它很簡單,只要'datasource.Cast ()ToList();'如果不是的話,你有一個設計問題。一種解決方案是在你的集合中爲你的所有項目類型提供一個通用接口,該接口包含你的消費者方法'CreateChildControls()'中需要的所有成員。 'datasource.Cast ().ToList();' – bitbonk

+0

@bitbonk:如果您的代碼屬於通過'數據源是IList'那麼這將是一個列表。無需創建列表,您可以將其轉換爲列表。那麼'原始格式'的問題不是問題 –

6

我重讀你的問題,似乎正在接收數據集這已經是一個列表或數據集,但它被強制轉換爲IEnumerable。在這種情況下,簡單地做

IList myList = (IList)datasource //will throw exception if invalid 

IList myList = datasource as IList //mylist will be null if conversion cannot be made 
+0

'dataSource.ToList()'不會工作,因爲dataSource不是IEnumerable類型的 bitbonk

+0

這是真的,我編輯它以反映這種情況。有沒有必要建立一個新的列表,因爲如果「X是Y」測試suceeeds那麼簡單(Y)x將一代產量的結果很少的處理開銷 –

0

要回答你的問題「我怎麼可以得到原始類型,而不是設置對象類型?」。

每種類型在.NET框架包含GetType方法來獲取指定對象的類型。您可以在ToList方法之前使用它。

相關問題