开发者

How do I invoke HasValue on a nullable property of an object via reflection?

This function loops all properties of an object to create the updatequery to save te object to the DB.

We had to make some changes to it because of the introduction of nullable properties. If the property is nullable we would like to check the 'HasValue' property. This does works when it has a value. When the property has no value we get an 'Non-static method requires a target'-error at the CBool-line

Any suggestions? An other way to check the 'HasValue'-prop of a property using reflection?

Thanks.


Private Function GetUpdateQuery(ByVal obj As Object, ByRef params As List(Of SqlParameter), Optional ByVal excl As String() = Nothing) As String
     Dim sql As String = String.Empty

     Dim props As PropertyInfo() = obj.GetType().GetProperties

     If excl Is Nothing Then
          excl = New String() {}
     End If

     For Each prop As PropertyInfo In props
          Try
               If Not excl.Contains(prop.Name) And prop.CanWrite = True Then
                    sql &= String.Format("{0} = @{1},", prop.Name, prop.Name)

                    Dim param As SqlParameter

                    开发者_C百科Dim value As Object

                    If prop.PropertyType.IsGenericType AndAlso prop.PropertyType.GetGenericTypeDefinition() = GetType(Nullable(Of )) Then

                         If CBool(prop.PropertyType.GetProperty("HasValue").GetValue(prop.GetValue(obj, Nothing), Nothing)) Then
                              value = prop.GetValue(obj, Nothing)
                         Else
                              value = DBNull.Value
                         End If
                    Else
                         If prop.GetValue(obj, Nothing) = Nothing Then
                              value = DBNull.Value
                         Else
                              value = prop.GetValue(obj, Nothing)
                         End If
                    End If
                    param = ConnSql.CreateParameter("@" & prop.Name, value)

                    params.Add(param)
               End If
          Catch ex As Exception

          End Try

     Next

     sql = sql.Substring(0, sql.Length - 1)

     Return sql
End Function


You do not need the following If. You can remove it.

If prop.PropertyType.IsGenericType AndAlso prop.PropertyType.GetGenericTypeDefinition() = GetType(Nullable(Of )) Then

BUT you do need to fix the following If:

If prop.GetValue(obj, Nothing) = Nothing Then

to

If prop.GetValue(obj, Nothing) IS Nothing Then

--

Complete code:

Private Function GetUpdateQuery(ByVal obj As Object, ByRef params As List(Of SqlParameter), Optional ByVal excl As String() = Nothing) As String
     Dim sql As String = String.Empty

     Dim props As PropertyInfo() = obj.GetType().GetProperties

     If excl Is Nothing Then
          excl = New String() {}
     End If

     For Each prop As PropertyInfo In props
          If Not excl.Contains(prop.Name) And prop.CanWrite = True Then
               sql &= String.Format("{0} = @{1},", prop.Name, prop.Name)

               Dim param As SqlParameter

               Dim value As Object

               If prop.GetValue(obj, Nothing) Is Nothing Then
                    value = DBNull.Value
               Else
                    value = prop.GetValue(obj, Nothing)
               End If

               param = ConnSql.CreateParameter("@" & prop.Name, value)

               params.Add(param)
          End If
     Next

     sql = sql.Substring(0, sql.Length - 1)

     Return sql
End Function
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜