VisualBasic CategoryAttribute: Category, Description und DefaultValue auslesen...

second.name

Lieutenant
Registriert
Sep. 2009
Beiträge
691
Hallo Forum,

wie lese ich die "CategoryAttribute" Category, Description und DefaultValue einer Property (z.B.: TextBox.Text) aus?
 
Weshalb willst du die auslesen? Die sind doch eh nur für die Designtime gedacht und werden so oder so mit Standardwerten besetzt, wenn du ein neues Objekt erstellst.
 
...Ich habe eine Klasse mit 19 Eigenschaften (alle mit CategoryAttributes). Wenn eine parameterlose Instanz erstellt wird (Sub New), sollen über Reflektion die DefaultValues an die Member-Variablen übergeben werden. ...Oder hat jemand eine andere Idee?
Ergänzung ()

...Hat jemand eine Idee? ...oder ist dieser Ansatz "doof"?
Ergänzung ()

Hat denn niemand eine Idee, wie ich "DefaultValue" zur Laufzeit auslesen kann?

Code:
    <Category("Entwurf"), _
     DefaultValue(GetType(String), "Maschine"), _
     Description("Der Name der Maschine"), _
     Browsable(True)> _
    Public Property Name() As String
        Get
            Return myName
        End Get
        Set(ByVal value As String)
            myName = value.Trim.Substring(0, Math.Min(16, value.Length))
        End Set
    End Property
 
Der Default-Wert sollte doch sowieso im Konstruktor gesetzt werden bzw. beim Erstellen des Controls zur Designtime? Weiß gerade nicht, ob der DefaultValue-Wert zur Laufzeit übernommen wird. Theoretisch sollte er das aber für die Property.
 
...Ich wollte Redundanz vermeiden! ...Kann denn aber nun jemand eine Antwort geben???
 
Property-Attribute kannst du mit der GetCustomAttributes-Methode der entsprechenden PropertyInfo auslesen.
An die PropertyInfos kommst du über den Type deiner Klasse.

Dein Ansatz ist trotzdem nicht empfehlenswert.
Die Attribute sind wirklich nur für den Designer gedacht, damit er erkennen kann ob ein Wert vom Standardwert abweicht und den Wert im Eigenschaften-Fenster fett darstellt. Setzen solltest du die Werte aber im Konstruktor.

Noch ein Rat (aus eigener leidiger Erfahrung):
Generell sollte man Reflection sehr sparsam und vorsichtig einsetzen. Die dadurch entstehende Dynamik macht jegliches Refactroing zum absoluten Glücksspiel.
Deshalb: Reflection ist nur einen Notlösung wenn es gar nicht mehr anderes geht. Und in deinem Fall geht es definitiv anderes (und somit besser). ;)
 
...Ich bin's nochmal: Hab's jetzt doch umgesetzt, mit der Begründung, Redundanz zu vermeiden.
...Sieht wie folgt aus:

Code:
Public Shared Function initMembers(ByVal obj As Object) As Object

        Dim locObj As Object = obj

        Try

            Dim locType As Type = locObj.GetType

            Dim locMembers() As MemberInfo = locType.GetMembers()

            For Each locMember As MemberInfo In locMembers

                If locMember.MemberType = MemberTypes.Property Then

                    Dim locPropertyInfo As PropertyInfo = CType(locMember, PropertyInfo)

                    Dim locAttributeCollection As AttributeCollection = TypeDescriptor.GetProperties(locObj)(locMember.Name).Attributes

                    Dim locDefaultAttribute As DefaultValueAttribute = CType(locAttributeCollection(GetType(DefaultValueAttribute)), DefaultValueAttribute)

                    If locDefaultAttribute IsNot Nothing Then locPropertyInfo.SetValue(locObj, locDefaultAttribute.Value, Nothing)

                End If

            Next

            Return locObj

        Catch ex As Exception

            Return obj

        End Try

End Function

Bei Anregungen bitte posten - danke! :)
 
Zurück
Oben