Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Finding Properties in Objects and Write and Read to them

0.00/5 (No votes)
20 Nov 2014 2  
Sometimes, it is useful to know if an object has a certain property and then fill it by only having the propertyname as a string at hand.

Introduction

Sometimes, it is useful to know if an object has a certain property and then fill it by only having the propertyname as a string at hand.

Background

The core can be found in 2 functions. They are a bit FAT but I copied them from a project I made where I first generate VB.NET code for an Class entity using the data returned from a .NET DataTable object. Next, this entity can bind itself as long as the fieldnames don't change in the database.

I included a sample project where we were experimenting a bit with this. You are welcome to use it.

The Code

The 2 functions are given below:

GET_SET_PropertyValue(name as string , optional Value as object)

findproperty(ByVal name As String, ByRef myProps As PropertyInfo) As String

Function 2 iterates through all properties and looks for the one you need. Function one sets and gets a property by only querying the string you enter at first. If it does not find the property, it uses Findproperty to look a bit deeper.

    ''' <summary>
    '''Find, Set and Get properties
    ''' </summary>
    ''' <param name="name">The name of property.</param>
    ''' <param name="value">optional The value if you want to set .</param>
    ''' <returns></returns>
    Private Function GET_SET_PropertyValue_
    (name As String, Optional value As Object = Nothing) As List(Of Object)
        Dim OriginalName As String = ""
        Dim propertyType As System.Type = Nothing
        Dim myProps As System.Reflection.PropertyInfo = Nothing
        Dim PropValue As Object = Nothing
        Dim returnlist As New List(Of Object)
        '' type of the setter object 
        Dim SetterValueType As System.Type = Nothing

        Try

            'try to find the property
            myProps = Me.GetType.GetProperty(name)
            '' is the infoObject is not empty we found it
            If Not (myProps Is Nothing) Then
                ''set the original name of the property
                OriginalName = name
            Else
                ' Lets see if we find it in all the collection of properties
                ' using findproperty(ByVal name As String, ByRef myProps As PropertyInfo)
                ' returning the name if its there. 
                OriginalName = findproperty(name, myProps)
            End If

            If myProps Is Nothing Or OriginalName = "" Then
                'we found nothing :( 
                returnlist.Add("error")
                returnlist.Add(name)
                returnlist.Add(name & " as a property name was not found.")
                returnlist.Add(name.GetType)
                Return returnlist ' ================> exit
            End If

        Catch ex As Exception
            If returnlist.Count > 0 Then returnlist = New List(Of Object)
            returnlist.Add("error")
            returnlist.Add(name)
            returnlist.Add(ex.Message)
            returnlist.Add(Err.GetType.ToString)
            Return returnlist ' ================> exit
        End Try


        '' GETTING PROPERTY VALUE
        If (value Is Nothing) Then '
            Try  'ALMOST HOME set the type  'no value to set so we want to get a value
                propertyType = myProps.GetType
                PropValue = myProps.GetValue(Me, Nothing)
                returnlist.Add("success")
                returnlist.Add(OriginalName)
                returnlist.Add(PropValue)
                returnlist.Add(propertyType.GetType.ToString)
                '' YEEEEEEEE FOUND IT
                Return returnlist ' ================> happy exit
            Catch ex As Exception
                If returnlist.Count > 0 Then returnlist = New List(Of Object)
                returnlist.Add("error")
                returnlist.Add(name)
                returnlist.Add(ex.Message)
                returnlist.Add(Err.GetType.ToString)
                Return returnlist ' ================> exit
            End Try
        End If

        '' SETTING PROPERTY VALUE
        Try  'ALMOST HOME WE READY TO SET A NEW VALUE
            'we change the property value 
            propertyType = myProps.GetType
            SetterValueType = value.GetType
            myProps.SetValue(Me, value)

            returnlist.Add("success")
            returnlist.Add(OriginalName)
            returnlist.Add("your object type: " & SetterValueType.GetType.ToString)
            returnlist.Add("the property type:" & propertyType.GetType.ToString)

            Return returnlist ' ================> happy exit

        Catch ex As Exception
            returnlist.Add("error")
            returnlist.Add(OriginalName)
            returnlist.Add(name)
            returnlist.Add(ex.Message)
            returnlist.Add(Err.GetType.ToString)
            returnlist.Add("your object type: " & SetterValueType.GetType.ToString)
            returnlist.Add("the property type:" & propertyType.GetType.ToString)
            Return returnlist ' ================>unhappy  happy exit
        End Try

    End Function

    ''' <summary>
    ''' Findproperties the specified name by iterating through  all the properties 
    ''' See function getAllProperties() As String() it uses this method to return a string() array
    ''' and by reference ByRef myProps As PropertyInfo.
    ''' </summary>
    ''' <param name="name">The name.</param>
    ''' <param name="myProps">My props.</param>
    ''' <returns>The propertyName as a string and _
    ''' ByRef the myProps As PropertyInfo object </returns>
    ''' 
    Private Function findproperty(ByVal name As String, ByRef myProps As PropertyInfo) As String
        Dim myMembers As PropertyInfo() = Me.GetType.GetProperties()
        Dim propertyname As String = ""

        Try
            If myMembers.Length > 0 Then
                Dim index As Integer
                For index = 0 To myMembers.Length - 1
                    ''  System.Diagnostics.Debug.Print((LCase(name)) 
                    ''  & "=" & LCase(myMembers(index).Name))

                    If LCase(myMembers(index).Name) = (LCase(name)) Then
                        myProps = myMembers(index)
                        propertyname = myMembers(index).Name
                        Return propertyname
                    End If
                Next index

                myProps = Nothing
                Return propertyname
            Else
                myProps = Nothing
                Return propertyname
            End If

        Catch ex As Exception
            myProps = Nothing
            Return propertyname
        End Try
    End Function

Getting the Properties from an Object

It is useful to use this one first and then set or read the properties with the code above.

    ''' <summary>
    ''' you can throw in any class and pray for the best See the overloaded method (of T))
    ''' </summary>
    ''' <typeparam name="T">the system type of the class</typeparam>
    ''' <param name="foreigner">The foreigner: instance of that class</param>
    ''' <returns>a array of  String()</returns>
    ''' 
    Public Function getAllProperties(Of T)(foreigner As T) As String()
        Dim pString As String()
        Try

            Dim myMembers As PropertyInfo() = foreigner.GetType.GetProperties()

            If myMembers.Length > 0 Then
                pString = New String(myMembers.Length - 1) {}

                Dim index As Integer

                For index = 0 To myMembers.Length - 1
                    pString(index) = myMembers(index).Name
                Next index

                Return pString
            Else
                pString = New String(0) {}
                pString(0) = "noproperties|system.Error"
            End If

        Catch ex As Exception
            pString = New String(0) {}
            pString(0) = "ERROR|" & ex.Message
        End Try

        Return pString

    End Function

History

  • 20th November, 2014: Initial version

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here