Thursday, April 08, 2010

MoveCorresponding vb.net

With the advent of .net and its reflection capabilities, a function that I really liked way back when COBOL was more in use (or is it still now "more in USE") was MoveCorresponding. 

The following code does the same in vb.net. I also show how to get attributes and parameters of an object.
Please correct me if I am wrong.
------------------------------------------------
Imports System.Reflection
Imports System.Collections.Generic

Public Class myReflections
 Public Shared Function GetProperties(ByVal ob As Object) As String
  Dim theType As Type = ob.GetType
  ' Get the properties in the object
  Dim properties() As PropertyInfo = theType.GetProperties()
  ' loop through the properties
  Dim msg As String = ""
  For Each prop As PropertyInfo In properties
   msg &= prop.Name + " is of type " + prop.PropertyType.ToString() + "  and "
   If prop.CanRead Then
    msg &= "Can be Read  and "
   Else
    msg &= " Cannot be Read and "
   End If

   If prop.CanWrite Then
    msg &= "Can be Written "
   Else
    msg &= "Cannot be Written "
   End If
   msg &= vbCrLf

  Next
  Return msg
 End Function

 Public Shared Function GetParameters(ByVal ob As Object) As String
  Dim myStr As String = "", theType As Type = ob.GetType
  ' sample call GetParameters(GetType(System.Math))
  ' Get the list of methods
  Dim myMethods() As MethodInfo = theType.GetMethods
  ' Loop thru the methods
  Dim MethodItem As MethodInfo
  For Each MethodItem In myMethods
   myStr = MethodItem.Name & " takes the following parameters: "
   ' Get the parameters for each method
   Dim myParms() As ParameterInfo = MethodItem.GetParameters
   ' point out if there are no parameters
   If myParms.Length = 0 Then
    myStr &= "
  • No parameters."
    End If
    Dim ParmItem As ParameterInfo
    ' output some details for each parameter
    For Each ParmItem In myParms
    With ParmItem
    myStr &= "
  • " & .Name & " of type " & _
    .ParameterType.ToString
    End With
    myStr &= "<&47;ul>"
    Next
    Next
    Return myStr
    End Function
    Public Shared Function CompareCorresponding(ByVal Ob1 As Object, ByVal ob2 As Object) As Boolean
    Try
    Dim result As Boolean = True
    If Ob1.GetType.Name <> ob2.GetType.Name Then
    Throw New ApplicationException("Objects of differing type cannot be compared." & vbCrLf & "Attempted to compare " & Ob1.GetType.Name & " and " & ob2.GetType.Name)
    End If
    Dim prop1() As PropertyInfo = Ob1.GetType.GetProperties
    Dim prop2() As PropertyInfo = ob2.GetType.GetProperties
    Dim missed As String = ""
    Dim i As Integer = -1
    Debug.Assert(prop1.Length = prop2.Length, "Number of properties varies between the objects!")
    Dim v1 As String = "", v2 As String = ""
    For i = 0 To prop1.Length - 1
    Debug.Assert(prop1(i).Name = prop2(i).Name, "The order of the properties is not the same for the objects")
    Dim p1 As PropertyInfo = prop1(i), p2 As PropertyInfo = prop2(i)
    'debug.print(p1.Name)
    Select Case p1.PropertyType.Name
    Case "Int32", "System.Int16", "Int64"
    v1 = GetV(p1, Ob1)
    v2 = GetV(p2, ob2)
    Case "String[]"
    v1 = GetV(p1, Ob1)
    v2 = GetV(p2, ob2)
    Case "String"
    v1 = GetV(p1, Ob1)
    v2 = GetV(p2, ob2)
    Case "Boolean"
    v1 = GetV(p1, Ob1)
    v2 = GetV(p2, ob2)
    Case Else
    missed &= p1.Name & "(" & p1.PropertyType.Name & "),"
    'debug.print(p1.Name & "(" & p1.PropertyType.Name & ") not compared")
    Continue For
    End Select
    'debug.print(v1)
    'debug.print(v2)
    result = result And String.Compare(v1, v2, True) = 0
    Debug.Assert(result = True)
    Next
    'debug.print(missed)
    Return result
    Catch ex As Exception
    Throw New ApplicationException(ex.Message)
    End Try
    End Function
    Private Shared Function GetV(ByVal p As PropertyInfo, ByVal o As Object) As String
    Dim result As String = "", len As Integer = p.GetIndexParameters().Length
    Dim fRes As String = ""
    Dim myIndex As Object = Nothing
    Dim myIndices() As Object = Nothing
    With p
    result = (p.GetValue(o, Nothing)).ToString
    If result = "System.String[]" Then
    myIndex = p.GetValue(o, myIndices)
    For i As Integer = 0 To CType(myIndex, System.Array).Length - 1
    result &= CType(myIndex, String())(i)
    Next
    ElseIf result = "Int32[]" OrElse result = "Int64[]" Then
    myIndex = p.GetValue(o, myIndices)
    For i As Integer = 0 To CType(myIndex, System.Array).Length - 1
    result &= CType(myIndex, String())(i)
    Next
    End If
    End With
    Return result
    End Function

    End Class
  • No comments: