当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Type.GetMethods的BindingFlags,不包括属性访问器》经验,为你挑选了1个好方法。

假设我有以下程序:

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> Krzysztof Ko..:

从我的头顶:

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

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

您也可以使用LINQ :)

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有