devxlogo

A command-line Object Browser that uses Reflection

A command-line Object Browser that uses Reflection

' This code is taken from Francesco Balena's' "Programming Microsoft Visual Basic .NET" - MS Press 2002, ISBN 0735613753' You can read a free chapter of the book at ' http://www.vb2themax.com/HtmlDoc.asp?Table=Books&ID=101000Imports System.ReflectionModule MainModule    Sub Main()        ' Get command-line arguments.        Dim args() As String = Environment.GetCommandLineArgs()        Dim cmd As String = Environment.CommandLine        Dim ty As Type        Dim mbrTypes As MemberTypes = MemberTypes.All        Dim mbrName As String = ""        Dim mi As MemberInfo        ' If no arguments, /? or /help        If args.Length ' Show command-line syntax and exit.            Console.WriteLine("Command-line Type Browser - by Francesco Balena")            Console.WriteLine("   Syntax:  typebrow typename [membername[*]]")            Exit Sub        End If        Dim i As Integer = args(1).IndexOf(","c)        If i ' Create the type as specified by first argument.            ty = Type.GetType(args(1), False, True)        Else            ' Create the assembly specified in the last part of the first             ' argument            Dim asmname As String = args(1).Substring(i + 1)            Dim asm As [Assembly] = [Assembly].LoadWithPartialName(asmname)            ' Get the type in the specified assembly.            ty = asm.GetType(args(1).Substring(0, i), False, True)        End If        If ty Is Nothing Then            ' Exit if error.            Console.WriteLine("Unable to create type ""{0}""", args(1))            Exit Sub        End If        ' If the user asked for a particular name.        If args.Length > 2 Then            ' Retrieve the name            mbrName = args(2)        End If        ' Get the list of member info to be displayed        Dim minfos() As MemberInfo = ty.FindMembers(mbrTypes, _            BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.Static, _            AddressOf CustomMemberFilter, mbrName)        ' Display information on all these members.        For Each mi In minfos            Console.WriteLine(MemberDescription(mi))        Next    End Sub    ' This is the custom filter for members.    ' On entry filterCriteria holds the name of the member we're looking for.    ' (Supports partial names with a trailing asterisk, as in "Repl*".)    Function CustomMemberFilter(ByVal m As MemberInfo, _        ByVal filterCriteria As Object) As Boolean        ' Discard accessor methods for properties.        If m.Name.StartsWith("get_") Or m.Name.StartsWith("set_") Then            Return False        End If        ' Get the search filter in uppercase.        Dim search As String = filterCriteria.ToString.ToUpper        If search = "" Then Return True        If search.EndsWith("*") Then            ' If there is a trailing asterisk, checks for partial match.            If m.Name.ToUpper.StartsWith(search.Substring(0, _                search.Length - 1)) Then Return True        Else            ' Otherwise search for exact match.            If m.Name.ToUpper = search Then Return True        End If    End Function    ' Return the syntax for a member (field, property, methods, event).    Function MemberDescription(ByVal mi As MemberInfo) As String        Dim res As String        ' Different treatment for different types        Select Case mi.MemberType            Case MemberTypes.Field                ' Fields: append As clause.                Dim fdi As FieldInfo = CType(mi, FieldInfo)                res &= NameDescription(mi, fdi.IsStatic) & VBTypeDescription _                    (fdi.FieldType)            Case MemberTypes.Property                ' Properties: append parameter list and return type.                Dim pri As PropertyInfo = CType(mi, PropertyInfo)                res &= NameDescription(mi, False) & ParamListDescription _                    (pri.GetIndexParameters)                res &= VBTypeDescription(pri.PropertyType)            Case MemberTypes.Method                ' Methods: append parameter list and return type.                Dim mti As MethodInfo = CType(mi, MethodInfo)                res &= NameDescription(mi, mti.IsStatic) & ParamListDescription _                    (mti.GetParameters)                If Not (mti.ReturnType Is Nothing) Then                    res &= VBTypeDescription(mti.ReturnType, True)                End If            Case MemberTypes.Constructor                ' Constructor                Dim cti As ConstructorInfo = CType(mi, ConstructorInfo)                res &= NameDescription(mi, False) & ParamListDescription _                    (cti.GetParameters)            Case MemberTypes.Event                ' Events: append parameter list.                Dim evi As EventInfo = CType(mi, EventInfo)                ' Get the type that corresponds to the underlying delegate.                Dim delType As Type = evi.EventHandlerType                Dim mi2 As MethodInfo = delType.GetMethod("Invoke")                res &= NameDescription(mi, False) & ParamListDescription _                    (mi2.GetParameters)        End Select        Return res    End Function    ' Return a description for name.    ' (Including Shared and member type description.)    Function NameDescription(ByVal mi As MemberInfo, ByVal IsStatic As Boolean) _        As String        Dim res As String        ' Prefix with Shared if necessary        If IsStatic Then            res = "Shared "        End If        ' Append member type, but distinguish between Sub and Function        If mi.MemberType  MemberTypes.Method Then            ' if not a method, we can simply use the Enum.Format method.            res &= [Enum].Format(mi.MemberType.GetType, mi.MemberType, _                "G") & " "        Else            Dim meth As MethodInfo = CType(mi, MethodInfo)            If meth.ReturnType.Name = "Void" Then                res &= "Sub "            Else                res &= "Function "            End If        End If        ' Append name and return to caller.        If mi.MemberType = MemberTypes.Constructor Then            ' Visual Basic constructors are named "new"            res &= "New"        Else            ' A non-constructor element.            res &= mi.Name        End If        Return res    End Function    ' Return the description for a list of parameters.    Function ParamListDescription(ByVal pinfos() As ParameterInfo) As String        Dim res As String = "("        Dim i As Integer        ' Iterate over all parameters.        For i = 0 To pinfos.GetUpperBound(0)            ' Append description for this parameter.            res &= ParamDescription(pinfos(i))            ' Append a comma if this isn't the last argument.            If i ' Close the parenthesis and return to caller.        Return res & ")"    End Function    ' Return a description for a single parameter.    Function ParamDescription(ByVal pi As ParameterInfo) As String        Dim res As String        Dim pt As Type = pi.ParameterType        ' Start with Optional if necessary.        If pi.IsOptional Then res = "Optional "        ' Append ByVal or ByRef.        If pt.IsByRef Then            res &= "ByRef "        Else            res &= "ByVal "        End If        ' Append the parameter name.        res &= pi.Name        ' Append the type, but convert it to VB syntax.        res &= VBTypeDescription(pt)        ' Append the default value, if there is one.        If pi.IsOptional Then            ' Enclose the default value within quotes if it is a string.            If pt Is GetType(System.String) Then                res &= " = """ & pi.DefaultValue.ToString & """"            Else                res &= " = " & pi.DefaultValue.ToString            End If        End If        ' Return to the caller.        Return res    End Function    ' Return a parameter type in VB-friendly format.    Function VBTypeDescription(ByVal ty As Type, _        Optional ByVal PostfixArrayMarks As Boolean = False) As String        Dim res As String        ' Get the return type as a string.        res &= ty.Name        ' Drop trailing "[]" pair, is there is one.        If res.EndsWith("[]") Then            res = res.Substring(0, res.Length - 2)        End If        ' Drop trailing *, if there is one.        If res.EndsWith("*") Then            res = res.Substring(0, res.Length - 1)        End If        ' Adjust for VB-friendly names.        Select Case res            Case "Int16"                res = "Short"            Case "Int32"                res = "Integer"            Case "Int64"                res = "Long"            Case "Void"                ' this is the type "returned" by Sub                Return ""        End Select        ' Append "AS" and "()" if this is an array.        If Not ty.IsArray Then            res = " As " & res        ElseIf PostfixArrayMarks Then            ' Append trailing () pair.            res = " As " & res & "()"        Else            ' Prefix leading () pair.            res = "() As " & res        End If        ' Return to the caller.        Return res    End FunctionEnd Module

devx-admin

Share the Post: