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

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

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

  • собственность bool Enabled { get; } будет получить bool get_Enabled()

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

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

Ответы [ 3 ]

26 голосов
/ 07 сентября 2010
typeof(MyType)
    .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
    .Where(m => !m.IsSpecialName)
2 голосов
/ 07 сентября 2010

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

0 голосов
/ 25 августа 2017

Секрет - BindingFlags. Объявлено только

...