Public Function GetProperty(objInput As Object, proString As String, Optional delimiter As String = "_") Dim proPath As String() = Split(proString, delimiter), objLoc As Object = objInput For Each p As String In proPath If objLoc.GetType.GetProperty(p) Is Nothing Then ' property p not found, return null objLoc = DBNull.Value : Exit For Else If IsNothing(objLoc.GetType.GetProperty(p + "Specified")) Then ' property specified for some kinds of data objects If objLoc.GetType.GetProperty(p).GetValue(objLoc) Is Nothing Then ' property p is nothing, return null objLoc = DBNull.Value : Exit For ElseIf objLoc.GetType.GetProperty(p).GetValue(objLoc).GetType.BaseType.Name = "CollectionBase" Then ' property p is a collection, return the first child If objLoc.GetType.GetProperty(p).GetValue(objLoc).Count = 0 Then ' property p is an empty collection, return null objLoc = DBNull.Value : Exit For Else objLoc = objLoc.GetType.GetProperty(p).GetValue(objLoc).Item(0) End If Else objLoc = objLoc.GetType.GetProperty(p).GetValue(objLoc) End If ElseIf objLoc.GetType.GetProperty(p + "Specified").GetValue(objLoc) Then If objLoc.GetType.GetProperty(p).GetValue(objLoc) Is Nothing Then ' property p is nothing, return null objLoc = DBNull.Value : Exit For ElseIf objLoc.GetType.GetProperty(p).GetValue(objLoc).GetType.BaseType.Name = "CollectionBase" Then ' property p is a collection, return the first child If objLoc.GetType.GetProperty(p).GetValue(objLoc).Count = 0 Then ' property p is an empty collection, return null objLoc = DBNull.Value : Exit For Else objLoc = objLoc.GetType.GetProperty(p).GetValue(objLoc).Item(0) End If Else objLoc = objLoc.GetType.GetProperty(p).GetValue(objLoc) End If Else objLoc = DBNull.Value : Exit For End If End If Next Return objLoc End Function