BindingFlags для Type.GetMethods, за исключением средств доступа к свойствам - PullRequest
16 голосов
/ 24 октября 2008

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

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 Ответ

17 голосов
/ 24 октября 2008

С макушки моей головы:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...