C# 获取层次结构中具有特定接口的UserControl
我有一个.aspx页面,它有许多控件 我想递归搜索页面。控件集合 我自己添加的UserControl有一个接口IUserControl 使用此扩展方法: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) {
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