假设我有以下程序:

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

I want to skip the property accesor methods. I've tried with different BindingFlags, for instance, ~BindingFlags.SetProperty, but with no luck. At the moment the only way I've found to skip those methods is rewriting the iterate function to:

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 :)

关于.net - Type.GetMethods的BindingFlags(不包括属性访问器),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/234330/

10-10 10:04