Подтвердить что ты не робот

BindingFlags для Type.GetMethods, исключая атрибуты доступа

Предположим, у меня есть следующая программа:

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 (к сожалению) не вариант.

4b9b3361

Ответ 1

С головы:

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

должно быть установлено все. SpecialName больше, чем атрибуты доступа к ресурсам (здесь также учитываются методы добавления/удаления событий), поэтому вам также нужно проверить имена.

Вы также можете использовать LINQ для этого:)