Как я могу вызвать HasValue для обнуляемого свойства объекта через отражение? - PullRequest
3 голосов
/ 15 сентября 2010

Эта функция зацикливает все свойства объекта для создания запроса на обновление, чтобы сохранить объект в БД.

Нам пришлось внести в него некоторые изменения из-за введения свойств, допускающих значение NULL.Если свойство имеет значение null, мы хотели бы проверить свойство HasValue.Это работает, когда оно имеет значение.Когда свойство не имеет значения, мы получаем ошибку «Нестатический метод требует целевой» в строке CBool ​​

Есть предложения?Другой способ проверить свойство HasValue для свойства с помощью отражения?

Спасибо.


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

                    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

1 Ответ

3 голосов
/ 08 февраля 2011

Вам не нужно следующее If. Вы можете удалить его.

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

НО вам нужно исправить следующее If:

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

до

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

-

Полный код:

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
...