8 votes

Vérifier qu'un objet possède une certaine propriété

J'ai trouvé du code C# pour cela aquí

Alors j'ai essayé

Public Function checkProperty(ByVal objectt As Object, ByVal propertyy As String) As Boolean
    Dim type As Type = objectt.GetType
    Return type.GetMethod(propertyy)
End Function

Mais il y a une erreur à type.GetMethod(propertyy) en disant "Value of type 'System.Reflection.MethodInfo' cannot be converted to 'Boolean'."

Que faire ?

20voto

dasblinkenlight Points 264350

Tout d'abord, le code C# vérifie la présence d'un fichier de type méthode et non une propriété. Deuxièmement, le code C# compare le retour à null :

Public Function checkProperty(ByVal objectt As Object, ByVal propertyy As String) As Boolean
    Dim type As Type = objectt.GetType
    Return type.GetProperty(propertyy) IsNot Nothing
End Function

EDIT Pour vérifier champs modifier la méthode comme suit :

Public Function checkField(ByVal objectt As Object, ByVal fieldName As String) As Boolean
    Dim type As Type = objectt.GetType
    Return type.GetField(fieldName) IsNot Nothing
End Function

5voto

Simon Wang Points 1927

Il retourne le MethodInfo à la place et vous pouvez le changer comme suit :

Public Function checkProperty(ByVal objectt As Object, ByVal propertyy As String) As Boolean
    Dim type As Type = objectt.GetType
    Return type.GetMethod(propertyy) IsNot Nothing
End Function

0voto

tom.dietrich Points 3122

Vous essayez de renvoyer type.GetMethod(propertyy), alors que votre code d'exemple renvoie le résultat de l'évaluation de cette méthode, qu'elle soit nulle ou non.

essayez Return type.GetMethod(propertyy) isnot nothing

0voto

Evert Points 1

En divisant la ligne :

        Return type.GetMethod(propertyy) IsNot Nothing

de dasblinkenlight dans les trois lignes ;

        Dim info As System.Reflection.PropertyInfo = type.GetProperty(propertyy)
        Dim reallyExists As Boolean = info IsNot Nothing
        Return reallyExists

la fonction checkProperty retournera vrai sur les propriétés existantes.

Je ne peux pas commenter la réponse de dasblinkenlight, puisque ma réputation est toujours inférieure à 50, j'envoie donc mon amélioration ci-dessus sur sa réponse comme une nouvelle réponse. Je ne suis pas satisfait de cette situation, car elle rend les pages de stackoverflow moins lisibles. Afin de faire de cette réponse une vraie réponse, j'inclus un module que j'ai créé, dans lequel les lignes

Public Function propertyExists( _

par le biais de

End Function

sont des améliorations au code de la fonction checkProperty de natli et dasblinkenlight.

Voir Vérifier qu'un objet possède une certaine propriété pour la question de natli, à laquelle je réponds. Voir https://stackoverflow.com/posts/9399928/revisions et la question du natli pour la réponse de dasblinkenlight, que je commente.

Au fait : "Comme vous le verrez ci-dessous, je préfère ne pas utiliser les espaces de noms du système, afin que je puisse voir directement quelles fonctions du système sont référencées."

Le module portant le nom de net2Module que j'ai créé pour l'utiliser est le suivant ;

''' <summary>
''' This module with the name net2Module contains
''' tools that need at least .NET Framework 2.0.
''' This module needs System.Reflection.
''' </summary>
Public Module net2Module

''' <summary>
''' If one of the tools fails, the property exceptionMessage will
''' not be nothing, but contain an exception.
''' Each tool will set exceptionMessage to nothing or an exception.
''' </summary>
Public exceptionMessage As System.Exception = Nothing

''' <summary>
''' Checks if a property with some name exist in an object.
''' This function needs System.Reflection.
''' </summary>
''' <param name="objectt">The object.</param>
''' <param name="propertyy">The name of the property.</param>
''' <returns>True if the property exists.</returns>
Public Function propertyExists( _
        objectt As Object, _
        ByVal propertyy As String _
        ) As Boolean
    Try
        exceptionMessage = Nothing
        Dim type As System.Type = objectt.GetType
        Dim info As System.Reflection.PropertyInfo = _
            type.GetProperty(propertyy)
        Dim reallyExists As Boolean = info IsNot Nothing
        Return reallyExists
    Catch ex As System.Exception
        exceptionMessage = ex
        Return False
    End Try
End Function ' propertyExists
End Module ' net2Module

Dans le code suivant j'utilise avec succès ma fonction propertyExists dans l'ordre pour fermer ou cacher les formulaires enfants récursivement ;

Friend Module sharedEnums
Friend Enum objectNamesEnum
    formHandlingClass
    calledForms
    ownedForms
End Enum ' objectNamesEnum

Friend Enum recursiveFormTypesEnum
    calledForms
    ownedForms
End Enum ' recursiveFormTypesEnum

Friend Enum recursiveActionsEnum
    hideForms
    closeForms
End Enum ' recursiveActionsEnum
End Module ' sharedEnums

Friend Class recursiveClass

Friend recursiveFormTypes As New recursiveFormTypesEnum

Friend recursiveActions As New recursiveActionsEnum

Friend Sub hideOrCloseFormsRecursively( _
        formsToHandle As System.Windows.Forms.Form())
    If Not formsToHandle Is Nothing Then
        Dim formToHandle As System.Windows.Forms.Form = Nothing
        Dim propertyToExist As String = String.Empty
        If Me.recursiveFormTypes = recursiveFormTypesEnum.calledForms Then
            propertyToExist = objectNamesEnum.calledForms.ToString
        Else ' Me.recursiveFormTypes = recursiveFormTypesEnum.ownedForms
            propertyToExist = objectNamesEnum.ownedForms.ToString
        End If
        For Each formToHandle In formsToHandle
            Try ' Recurse through the forms to handle
                Dim formObject As Object = formToHandle
                If net2Module.propertyExists(formObject, _
                        objectNamesEnum.formHandlingClass.ToString) Then
                    If net2Module.propertyExists( _
                            formObject.formHandlingClass, propertyToExist) Then
                        If Me.recursiveFormTypes = _
                                recursiveFormTypesEnum.calledForms Then
                            Call Me.hideOrCloseFormsRecursively( _
                                formObject.formHandlingClass.calledForms.ToArray)
                        Else ' Me.recursiveFormTypes = recursiveFormTypesEnum.ownedForms
                            Call Me.hideOrCloseFormsRecursively( _
                                formObject.formHandlingClass.ownedForms)
                        End If
                    End If
                End If
                If net2Module.propertyExists(formObject, propertyToExist) Then
                    If Me.recursiveFormTypes = _
                            recursiveFormTypesEnum.calledForms Then
                        Call Me.hideOrCloseFormsRecursively( _
                            formObject.calledForms.ToArray)
                    Else ' Me.recursiveFormTypes = recursiveFormTypesEnum.ownedForms
                        Call Me.hideOrCloseFormsRecursively( _
                            formObject.ownedForms)
                    End If
                End If
            Catch
            End Try
            Try ' Take the action to take on each found form
                If Me.recursiveActions = _
                        recursiveActionsEnum.hideForms Then
                    Call formToHandle.Hide()
                Else ' Me.recursiveActions = recursiveActionsEnum.closeForms
                    Call formToHandle.Close()
                End If
            Catch
            End Try
        Next
    End If
End Sub ' hideOrCloseFormsRecursively

End Class ' recursiveClass

Je serais ravie de lire vos commentaires si vous avez été aidé par moi ou non. Je suis néerlandaise et j'aimerais également recevoir des commentaires sur mon anglais, afin de pouvoir l'améliorer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X