我在 WebForm 中遇到一种情况,我需要递归遍历控件树以找到实现给定接口(interface)的所有控件。
我该怎么做?
我试过写这样的扩展方法
public static class ControlExtensions
{
public static List<T> FindControlsByInterface<T>(this Control control)
{
List<T> retval = new List<T>();
if (control.GetType() == typeof(T))
retval.Add((T)control);
foreach (Control c in control.Controls)
{
retval.AddRange(c.FindControlsByInterface<T>());
}
return retval;
}
}
但它不喜欢在第 7 行转换为 T
。
我还考虑过尝试使用 as 运算符,但这不适用于接口(interface)。
我看到了Scott Hanselmans disucssion但无法从中收集到任何有用信息。
谁能给我指点。谢谢。
格雷格
最佳答案
我认为你需要把这个方法分成两部分
- 递归查找控件
- 根据#1 查找实现接口(interface)的控件
这是#1
public static IEnumerable<Control> FindAllControls(this Control control) {
yield return control;
foreach ( var child in control.Controls ) {
foreach ( var all in child.FindAllControls() ) {
yield return all;
}
}
}
现在要获取一个类型的所有控件,使用OfType扩展方法
var all = someControl.FindAllControls().OfType<ISomeInterface>();
关于c# - 递归检查接口(interface)的实现,c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1160138/