C# 获取层次结构中具有特定接口的UserControl

C# 获取层次结构中具有特定接口的UserControl,c#,linq,C#,Linq,我有一个.aspx页面,它有许多控件 我想递归搜索页面。控件集合 我自己添加的UserControl有一个接口IUserControl 使用此扩展方法: public static T FindNodeInHierarchy<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> childrenSelector, Predicate<T> condition) {

我有一个.aspx页面,它有许多控件

我想递归搜索页面。控件集合

我自己添加的UserControl有一个接口IUserControl

使用此扩展方法:

public static T FindNodeInHierarchy<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> childrenSelector, Predicate<T> condition)
        {
            // return default wenn keine Items existieren
            if (source == null || !source.Any()) return default(T);

            // return result wenn item gefunden und hört auf die Liste durchzugehen
            var attempt = source.FirstOrDefault(t => condition(t));
            if (!Equals(attempt, default(T))) return attempt;

            // Ruft die Funktion auf eine Liste auf bis runter in alle Unterlisten bis das
            // entsprechende Objekt gefunden ist.
            return source.SelectMany(childrenSelector).FindNodeInHierarchy(childrenSelector, condition);
        }
public static T FindNodeInHierarchy(此IEnumerable源、Func childrenSelector、谓词条件)
{
//返回默认wenn keine项目存在
if(source==null | |!source.Any())返回默认值(T);
//返回结果wenn item gefunden和hört auf die Liste durchzugehen
var-trument=source.FirstOrDefault(t=>condition(t));
如果(!等于(尝试,默认值(T)),则返回尝试;
//你可以把它放在所有不受约束的地方
//这是一个很好的例子。
返回source.SelectMany(childrenSelector.FindNodeHierarchy(childrenSelector,条件);
}
当我尝试这样做时,我会从异常中获得一个内存:

 var query = Page.Controls
                .Cast<Control>()
                .FindNodeInHierarchy<Control>(c => Page.Controls.Cast<Control>(), c => c is IUserControl);
var query=Page.Controls
.Cast()
.FindNodeInHierarchy(c=>Page.Controls.Cast(),c=>c是IUserControl);
我也尝试了
.OfType()

但是我得到了返回的空值

我如何使用放在计算机上某处的IUserControl接口获取此UserControl

站点?

公共IEnumerable FindControl(控件c)
public IEnumerable<TControl> FindControls<TControl>(Control c)
{
    var tc = c as TControl;
    if (tc != null)
        yield return tc;

    foreach (var cc in c.Controls)
    {
        foreach (var res in FindControls<TControl>(cc))
            yield return res;
    }
}
{ var tc=c作为t控制; 如果(tc!=null) 收益率; foreach(c.Controls中的var cc) { foreach(FindControl(cc)中的var res) 收益率; } }
例如,您可以通过传递要搜索的根控件来调用它

var myuc = FindControls<IUserControl>(Page);
var myuc=findControl(第页);

谢谢,但我已经有了一个递归函数。我想知道如何使用它来在Page.Controls中查找IUserControl。@Elisa这个解决方案对您不起作用吗?在底部有一个示例用法。我不想在我有一个通用方法时引入一个新方法。我确实希望在解决我的直接上下文相关问题时考虑我的代码。顺便说一句,当我把你的代码放在一个类中时,它不会编译。试试看。似乎您的复制/粘贴问题不止一次::P