Type.GetMethods的BindingFlags,不包括属性访问器

Lea*_*pez 16 .net reflection

假设我有以下程序:

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行程序时,我得到以下输出:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

你知道我BindingFlags应该用什么吗?

更新:

好吧,我应该已经解释过该项目实际上是用于构建单元测试的自动模板,所以我可以跳过所有特殊方法.感谢有关IsSpecialName :)的其他信息

LINQ?真?哇.无论如何,这个项目是.NET 2.0,所以LINQ(遗憾地)不是一个选项.

Krz*_*mic 18

从我的头顶:

mi.IsSpecialName &&( mi.Name.StartsWith("set_") || mi.Name.StartsWith("get_"))
Run Code Online (Sandbox Code Playgroud)

应该让你全部定下来.SpecialName不仅仅是属性访问器(事件添加/删除方法也在这里计算),这就是你必须检查名称的原因.

您也可以使用LINQ :)