如果之前有人问过并回答我但我无法找到答案,我很抱歉。
我知道如何浏览控件集合并获取所有控件的列表,包括子控件。
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方法通过名称在控件中查找特定方法,但我想要一个所有方法的列表,而不知道他们的名字提前。此外,是否可以获得控件中所有内容的列表:方法,输入字段等?非常感谢您的帮助。谢谢。
答案 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)
您可以在此处找到列出班级成员的示例:
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上的文章包括完整的描述以及如何使用每个功能的示例。