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 <= 1 OrElse args(1) = "/?" OrElse String.Compare(args(1), _            "/help", True) = 0 Then            ' 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 < 0 Then            ' 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 < pinfos.GetUpperBound(0) Then res &= ", "        Next        ' 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

Share the Post:
Heading photo, Metadata.

What is Metadata?

What is metadata? Well, It’s an odd concept to wrap your head around. Metadata is essentially the secondary layer of data that tracks details about the “regular” data. The regular

XDR solutions

The Benefits of Using XDR Solutions

Cybercriminals constantly adapt their strategies, developing newer, more powerful, and intelligent ways to attack your network. Since security professionals must innovate as well, more conventional endpoint detection solutions have evolved

AI is revolutionizing fraud detection

How AI is Revolutionizing Fraud Detection

Artificial intelligence – commonly known as AI – means a form of technology with multiple uses. As a result, it has become extremely valuable to a number of businesses across

AI innovation

Companies Leading AI Innovation in 2023

Artificial intelligence (AI) has been transforming industries and revolutionizing business operations. AI’s potential to enhance efficiency and productivity has become crucial to many businesses. As we move into 2023, several

data fivetran pricing

Fivetran Pricing Explained

One of the biggest trends of the 21st century is the massive surge in analytics. Analytics is the process of utilizing data to drive future decision-making. With so much of

kubernetes logging

Kubernetes Logging: What You Need to Know

Kubernetes from Google is one of the most popular open-source and free container management solutions made to make managing and deploying applications easier. It has a solid architecture that makes

ransomware cyber attack

Why Is Ransomware Such a Major Threat?

One of the most significant cyber threats faced by modern organizations is a ransomware attack. Ransomware attacks have grown in both sophistication and frequency over the past few years, forcing