Пример использования отфильтрованной коллекции FieldInfo объектов, возвращаемых Type.GetType().GetFields()
Поскольку вы хотите, чтобы этот метод возвращал как открытые, так и непубличные поля,коллекция должна быть отфильтрована, потому что, поскольку это класс Form, он будет включать все элементы управления, которые содержит форма.
Коллекция FieldInfo
затем фильтруется с использованием FieldType.Namespace
, где Namespace
не System.Windows.Forms
.
BindingFlags установлены на Instance | Public | NonPublic | DeclaredOnly
.
Когда поле представляет коллекцию (список, словарь и т. Д.), Свойство Type.GenericTypeArguments необходимо проанализировать для извлечения аргументов коллекции.
I'mиспользование нескольких вспомогательных функций для очистки имени поля и извлечения набора аргументов в виде отформатированной строки.
Использование примера полей, которые вы разместили (я добавил словарь, чтобы проверить вывод):
Dim Town As String
Dim ZIP As String
Dim StreetName As String
Dim StreetNo As String
Public dtCountries As DataTable
Public LstCities As List(Of String)
Public DictOfControls As Dictionary(Of String, Control)
это результат:
Dim ClassFields As New DataTable
ClassFields.Columns.Add("ID", GetType(Integer))
ClassFields.Columns.Add("Name", GetType(String))
ClassFields.Columns.Add("FieldType", GetType(String))
Dim flags As BindingFlags = BindingFlags.Instance Or
BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.DeclaredOnly
Dim allFields As List(Of FieldInfo) =
Me.GetType().GetFields(flags).
Where(Function(f) (Not (f.FieldType.Namespace.Equals("System.Windows.Forms"))) AndAlso f.Name <> "components").
ToList()
For Each field As FieldInfo In allFields
Dim dr As DataRow = ClassFields.NewRow
dr("ID") = ClassFields.Rows.Count + 1
dr("Name") = field.Name
dr("FieldType") = GetFieldTypeName(field.FieldType.Name) &
GetTypeArguments(field.FieldType.GenericTypeArguments)
ClassFields.Rows.Add(dr)
Next
Private Function GetFieldTypeName(field As String) As String
Dim EndPosition As Integer = field.IndexOf(ChrW(96))
Return If(EndPosition > 0, field.Substring(0, EndPosition), field)
End Function
Private Function GetTypeArguments(args As Type()) As String
If args.Length = 0 Then Return String.Empty
Return $" ({String.Join(", ", args.Select(Function(arg) arg.Name))})"
End Function
Если Интерполированная строка недоступна (до версии 14 VB.Net), используйте строку Составной формат :
Return $" ({String.Join(", ", args.Select(Function(arg) arg.Name))})"
можно выразить как:
Return String.Format(" ({0})", String.Join(", ", args.Select(Function(arg) arg.Name)))