C#列出控件中的所有方法

时间:2013-01-22 21:03:58

标签: c# reflection user-controls

如果之前有人问过并回答我但我无法找到答案,我很抱歉。

我知道如何浏览控件集合并获取所有控件的列表,包括子控件。

    void printControlTree(Control ctl, int indent)
    {
      string pad = "";
      for(int i=0; i < indent; i++)
      {
        pad += "   ";
      }

      Print(pad + "=> " + ctl.Name);

      if (ctl.Controls != null && ctl.Controls.Count > 0)
      {
        foreach (Control c in ctl.Controls)
        {
            printControlTree(c, indent+1);
        }
      }
     }

我想要做的是获得每个控件和子控件中所有方法的列表。这可能吗?我会这么认为,因为有Control.ControlCollection.Find方法通过名称在控件中查找特定方法,但我想要一个所有方法的列表,而不知道他们的名字提前。此外,是否可以获得控件中所有内容的列表:方法,输入字段等?非常感谢您的帮助。谢谢。

3 个答案:

答案 0 :(得分:5)

static void PrintMethods(Object o) {

    Type t = o.GetType();
    MethodInfo[] methods = t.GetMethods();
    foreach(MethodInfo method in methods) {

        Print( method.Name );
    }


}

答案 1 :(得分:0)

首先,我们将从一个方法开始,该方法返回控件的所有子控件(递归),而不是仅仅打印它们。

public static IEnumerable<Control> GetAllControls(Control control)
{
    Stack<Control> stack = new Stack<Control>();
    stack.Push(control);

    while (stack.Any())
    {
        var next = stack.Pop();
        yield return next;
        foreach (var child in next.Controls.OfType<Control>())
        {
            stack.Push(child);
        }
    }
}

接下来,我们将编写一个方法,给定一系列对象,将其转换为所有这些对象的所有方法的序列:

public static IEnumerable<MethodInfo> GetMethods<T>(IEnumerable<T> sequence)
{
    return sequence.GroupBy(obj => obj.GetType())
        .SelectMany(group => group.Key.GetMethods());
}

现在我们打电话给他们:

foreach(var methodInfo in GetMethods(GetAllControls(someControl))
{
    //print method name
}

如果您认为您将足够使用这些方法,则可能需要将它们转换为扩展方法。

答案 2 :(得分:-1)

您可以在此处找到列出班级成员的示例:

Viewing Type Information

using System;
using System.IO;
using System.Reflection;

class Mymemberinfo
{
    public static void Main()
    {
        Console.WriteLine ("\nReflection.MemberInfo");
        // Gets the Type and MemberInfo.
        Type MyType = Type.GetType("System.IO.File");
        MemberInfo[] Mymemberinfoarray = MyType.GetMembers();
        // Gets and displays the DeclaringType method.
        Console.WriteLine("\nThere are {0} members in {1}.",
            Mymemberinfoarray.Length, MyType.FullName);
        Console.WriteLine("{0}.", MyType.FullName);
        if (MyType.IsPublic)
        {
            Console.WriteLine("{0} is public.", MyType.FullName);
        }
    }
}

如果你已经有了一个对象(比如一个控件),你就可以绕过上面的一些代码:

using System;
using System.IO;
using System.Reflection;

class Mymemberinfo
{
    public static void Main()
    {
        // Whatever kind of control you are using:
        Object l_control = new Object();

        Console.WriteLine ("\nReflection.MemberInfo");
        // Gets the Type and MemberInfo.

        // ----- Call l_control.GetType();
        Type MyType = l_control.GetType();
        MemberInfo[] Mymemberinfoarray = MyType.GetMembers();
        // Gets and displays the DeclaringType method.
        Console.WriteLine("\nThere are {0} members in {1}.",
            Mymemberinfoarray.Length, MyType.FullName);
        Console.WriteLine("{0}.", MyType.FullName);
        if (MyType.IsPublic)
        {
            Console.WriteLine("{0} is public.", MyType.FullName);
        }
    }
}

您可以在MSDN网站上阅读有关反思的更多信息:

Reflection in the .NET Framework

MSDN上的文章包括完整的描述以及如何使用每个功能的示例。