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.