Попробуйте это:
Function GetClassMethods(ByVal theType As Type) As List(Of String)
Dim flags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.DeclaredOnly
Dim result = theType.GetMethods(flags).
Where(Function(m) Not m.IsSpecialName).
Select(Function(m) m.Name)
Return result.ToList()
End Function
или для развлечения с дженериками:
Function GetClassMethods(Of T)() As List(Of String)
Dim flags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.DeclaredOnly
Dim result = GetType(T).GetMethods(flags).
Where(Function(m) Not m.IsSpecialName).
Select(Function(m) m.Name)
Return result.ToList()
End Function
Фильтр IsSpecialName
исключает методы с именами, сгенерированными компилятором, такие как специальные методы, используемые компилятором для реализации свойств. Вы также можете поиграть с флагами больше, если вам нужно включить, скажем, и непубличных участников.
Наконец, когда у вас есть метод, заканчивающийся на Return something.ToList()
(или который может закончиться этим, как показывает моя адаптация), почти всегда лучше изменить метод, чтобы он возвращал IEnumerable(Of T)
вместо и позвольте вызывающему коду позвонить ToList()
, если это действительно необходимо. Так что мой первый пример выше действительно так:
Function GetClassMethods(ByVal theType As Type) As IEnumerable(Of String)
Dim flags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.DeclaredOnly
Return theType.GetMethods(flags).
Where(Function(m) Not m.IsSpecialName).
Select(Function(m) m.Name)
End Function
Эй, это может быть однострочник. Тогда для тех ситуаций, когда вам действительно нужен список, вы можете сделать это:
Dim methodNames As List(Of String) = GetClassMethods(HomeController).ToList()
Вы начнете находить во многих ситуациях, что вам вообще не нужно использовать ToList()
; универсальный IEnumerable
был достаточно хорош. Конечно, это верно везде, где вы просто используете результат с циклом For Each
. Теперь внезапно использование памяти в ваших программах значительно уменьшилось.