2011-07-25 59 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方法之前使用它。

相关问题