C#ControlCollection扩展GetAllTextboxes

Mel*_*sus 2 asp.net controlcollection c#-3.0

我怎么才能得到ControlCollection中的texbox?

我尝试:

public static IEnumerable<TextBox> TextBoxes(this ControlCollection controlCollection)
{
    return (IEnumerable<TextBox>)controlCollection.Cast<Control>().Where(c => c is TextBox);
}
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:无法将'WhereEnumerableIterator`1 [System.Web.UI.Control]'类型的对象强制转换为'System.Collections.Generic.IEnumerable`1 [System.Web.UI.WebControls.TextBox] ".

我用C#使用Asp.Net 3.5

Rex*_*x M 11

你实际上并不需要一个新的扩展方法 - 已经有一个适合你的方法:

controlCollection.OfType<TextBox>();
Run Code Online (Sandbox Code Playgroud)

OfType方法返回序列(IEnumerable<T>提供的序列的)子集.如果类型不可兑换,则省略.与大多数LINQ扩展方法不同,OfType可用于非强类型的序列:

此方法是可以应用于具有非参数化类型的集合(例如ArrayList)的少数标准查询运算符方法之一.这是因为OfType <(Of <(TResult>)>)扩展了IEnumerable类型.

或者如果你想将它包装在扩展方法中,它当然很简单:

public static IEnumerable<TextBox> TextBoxes(this ControlCollection controls)
{
    return controls.OfType<TextBox>();
}
Run Code Online (Sandbox Code Playgroud)