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

时间:2008-10-24 16:46:34

标签: .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);
            }
        }
    }
}

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

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(遗憾地)不是一个选项。

1 个答案:

答案 0 :(得分:17)

从头到尾:

mi.IsSpecialName &&( mi.Name.StartsWith("set_") || mi.Name.StartsWith("get_"))

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

您也可以使用LINQ:)