假设我有以下程序:
namespace ReflectionTest { public class Example { private string field; public void MethodOne() { } public void MethodTwo() { } public string Property { get { return field; } set { this.field = value; } } } class Program { static void Main(string[] args) { iterate(typeof(Example)); Console.ReadLine(); } public static void iterate(Type type) { MethodInfo[] methods = type.GetMethods( BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public); foreach (MethodInfo mi in methods) { Console.WriteLine(mi.Name); } } } }
当我运行程序时,我得到以下输出:
MethodOne MethodTwo get_Property set_Property
我想跳过属性访问方法.BindingFlags
例如,我尝试过不同的~BindingFlags.SetProperty
,但没有运气.目前,我发现跳过这些方法的唯一方法是将迭代函数重写为:
public static void iterate(Type type) { MethodInfo[] methods = type.GetMethods( BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public); foreach (MethodInfo mi in methods) { if (mi.IsSpecialName) continue; Console.WriteLine(mi.Name); } }
你知道我BindingFlags
应该用什么吗?
好吧,我应该已经解释过该项目实际上是用于构建单元测试的自动模板,所以我可以跳过所有特殊方法.感谢有关IsSpecialName :)的其他信息
LINQ?真?哇.无论如何,这个项目是.NET 2.0,所以LINQ(遗憾地)不是一个选项.
从我的头顶:
mi.IsSpecialName &&( mi.Name.StartsWith("set_") || mi.Name.StartsWith("get_"))
应该让你全部定下来.SpecialName不仅仅是属性访问器(事件添加/删除方法也在这里计算),这就是你必须检查名称的原因.
您也可以使用LINQ :)