Atlanta Custom Software Development 

 
   Search        Code/Page
 

User Login
Email

Password

 

Forgot the Password?
Services
» Web Development
» Maintenance
» Data Integration/BI
» Information Management
Programming
  Database
Automation
OS/Networking
Graphics
Links
Tools
» Regular Expr Tester
» Free Tools

A command-line Object Browser that uses Reflection

Total Hit ( 3446)

Rate this article:     Poor     Excellent 

 Submit Your Question/Comment about this article

Rating


 


Click here to copy the following block
' 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=101000

Imports System.Reflection

Module 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 Function

End Module


Submitted By : Nayan Patel  (Member Since : 5/26/2004 12:23:06 PM)

Job Description : He is the moderator of this site and currently working as an independent consultant. He works with VB.net/ASP.net, SQL Server and other MS technologies. He is MCSD.net, MCDBA and MCSE. In his free time he likes to watch funny movies and doing oil painting.
View all (893) submissions by this author  (Birth Date : 7/14/1981 )


Home   |  Comment   |  Contact Us   |  Privacy Policy   |  Terms & Conditions   |  BlogsZappySys

© 2008 BinaryWorld LLC. All rights reserved.