Showing posts with label reflection. Show all posts
Showing posts with label reflection. Show all posts

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