在页面上查找特定类型的所有UserControls,可能使用LINQ
本文关键字:UserControls LINQ 查找 类型 | 更新日期: 2023-09-27 18:00:37
我创建了一个由我的所有用户控件实现的基本用户控件(BaseUserControl)类。在这个类中,我有一个属性,它包含一组JavaScript URL引用。为这种类型的用户控件解析页面的最佳方式是什么?
我尝试使用LINQ,但我认为我不能用它查询Controls集合:
var controls = (from c in page.Controls where c is BaseUserControl)
foreach(control in controls){
var javascript = control.JavaScriptReference
}
实现这一点的更惯用的方法是使用Enumerable。OfType。
foreach(var control in page.Controls.OfType<BaseUserControl>()) {
var javascript = control.JavaScriptReference;
}
var javascript = page.Controls.OfType<BaseUserControl>().Select(c=> c.JavaScriptReference);
这应该行得通。
如果您只想要一个JavaScriptReference值的集合,您可以执行以下操作:
var javascriptReferences = page.Controls.Where(c => c is BaseUserControl)
.Select(c => c.JavaScriptReference);
我使用递归方法来解决这个问题。请参阅下面我通常使用的方法。
private void GetControls<T>(Control ctrl, List<T> result)
{
foreach (Control con in ctrl.Controls.OfType<Control>().Where(c => c.Controls.Count > 0))
GetControls<T>(con, result);
foreach (T control in ctrl.Controls.OfType<T>())
result.Add(control);
}
你可以这样称呼它:
List<BaseUserControl> baseUserControls = new List<BaseUserControl>();
GetControls<BaseUserControl>(Page.Controls, out baseUserControl);
之后,列表中会填充对BaseUserControls的引用。递归方法是必要的,因为Page.Controls
并不包含页面上的所有控件。页面上的某些控件是此集合中某个控件的子控件(甚至是这些控件的子对象),因此嵌套级别更深。因此采用递归方法。
您是否正确选择了控件?
var controls = (from c in page.Controls where c is BaseUserControl select c)
foreach(BaseUserControl control in controls)
{
var javascript = control.JavaScriptReference
}
foreach (var control in
page.Controls.OfType<BaseUserControl>())
{
var javascript = control.JavaScriptReference;
}