在页面上查找特定类型的所有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
}

在页面上查找特定类型的所有UserControls,可能使用LINQ

实现这一点的更惯用的方法是使用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;
}