c# - 递归检查接口(interface)的实现,c#

标签 c# reflection interface recursion

我在 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. 递归查找控件
  2. 根据#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/

相关文章:

c# - XML 阅读器 : how to catch syntax errors in the xml file?

c# - OpenXML - 如何将电子表格文档保存到流中?

Java:在嵌套参数化类型中获取内部类型(反射)

c# - 以静态方式通过反射调用非静态方法

c# - 使用另一个接口(interface)属性的 IList 实现接口(interface)的类...如何?

c# - 如何找到一段代码的执行时间?

scala - 模式匹配或 Scala 中的 isInstanceOf

java - 在程序中应用接口(interface)和抽象类的概念

javascript - jQuery UI : Drag and clone from original div, 但保留克隆

c# - Protobuf-net 尝试 JIT 编译方法 '(wrapper dynamic-method) ClassExtensions.StringArray