2009-11-26 7 views
1

Je suis confronté à un couple de problèmes dans VB.net: j'ai une série d'objets, dont les propriétés s'affichent dans une grille que l'utilisateur doit modifier.Propriétés de la liste/Vérifier si une propriété est en lecture seule

Mon premier problème est: comment obtenir une liste de toutes les propriétés d'un objet? Est-ce même possible? Le contrôle DataGrid que j'utilise accepte les valeurs de chaîne avec le nom de la propriété en tant que paramètres, mais les insérer manuellement serait un réel problème, car il y en a BEAUCOUP. Donc: existe-t-il un moyen d'obtenir une liste de chaînes avec le nom de chaque propriété d'un objet? Si cela est possible, voici la deuxième question: Maintenant, bien sûr, puisque les utilisateurs éditent les propriétés, je ne suis pas intéressé par les propriétés ReadOnly qu'ils ne peuvent pas éditer. D'où mon problème secodn: existe-t-il un moyen de vérifier si une propriété est en lecture seule au moment de l'exécution?

Merci à l'avance pour toute aide que vous pouvez donner (même si elle est juste un « il ne peut pas être fait »)

Répondre

3

Vous pouvez le faire avec la réflexion. Utilisez foo.GetType() pour obtenir le type d'un objet particulier. Ensuite, utilisez Type.GetProperties() pour trouver toutes les propriétés. Pour chaque propriété, vous pouvez savoir si elle est en écriture en utilisant PropertyInfo.CanWrite.

Voici un exemple simple:

Option Strict On 
Imports System 
Imports System.Reflection 

Public class Sample 

    ReadOnly Property Foo As String 
     Get 
      Return "Foo!" 
     End Get 
    End Property 

    Property Bar As String 
     Get 
      Return "Ar!" 
     End Get 
     Set 
      ' Ignored in sample 
     End Set 
    End Property 

End Class 

Public Class Test 

    Public Shared Sub Main() 
     Dim s As Sample = New Sample() 

     Dim t As Type = s.GetType() 
     For Each prop As PropertyInfo in t.GetProperties 
      Console.WriteLine(prop.Name) 
      If Not prop.CanWrite 
       Console.WriteLine(" (Read only)") 
      End If 
     Next prop 
    End Sub 

End Class 
+0

Merci Jon, rapide et clair, tout ce que je cherchais. Réponse acceptée –

0

Voilà comment boucle vous sur les propriétés en MyObject. Comme le dit Jon Skeet, vérifiez CanWrite pour vous aider avec la deuxième partie de votre question:

Dim MyProperties As System.Reflection.PropertyInfo() = MyObject.GetType().GetProperties() 
For Each prop As System.Reflection.PropertyInfo In MyProperties 
    If prop.CanWrite Then 
     //do stuff 
    End If 
Next 
Questions connexes