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

Фильтрация автоматически сгенерированных методов (getter/setter/add/remove/.etc), возвращаемых Type.GetMethods()

Я использую Type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) для извлечения массива методов для данного типа.

Проблема заключается в том, что возвращаемый MethodInfo может включать методы, которые генерируются компилятором, который я не хочу. Например:

  • свойство bool Enabled { get; } будет get bool get_Enabled()

  • событие SomethingChanged получит add_SomethingChanged(EventHandler) а также remove_SomethingChanged(EventHandler)

Возможно, я могу добавить некоторую логику фильтра, чтобы избавиться от них, что потенциально может стать очень сложным. Я хочу знать, есть ли что-то еще, что я могу сделать, например, с параметрами BindingFlags, чтобы получить только определенные пользователем методы?

4b9b3361

Ответ 1

typeof(MyType)
    .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
    .Where(m => !m.IsSpecialName)

Ответ 2

Я думаю, что лучше всего было бы отфильтровать методы, которые имеют атрибут CompilerGenerated. Вероятно, это будет более надежным, хотя это не объясняет, что гипотетические компиляторы будущего полностью не уважают этот атрибут. Тест IsSpecialName, вероятно, также требуется, поскольку он выглядит так, как будто компилятор С# не прикрепляет атрибут к методам event add и remove.

Ответ 3

Секрет - BindingFlags. DeclaredOnly

typeof(MyType).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)