Feedback

VB - Standardwerte für automatische Eigenschaften in .net 3.x

Veröffentlicht von am 10/7/2008
(2 Bewertungen)
Die Einführung von automatischen Eigenschaften hat den großen Vorteil dass weniger Tipparbeit nötig ist.

Ein wesentlicher Nachteil ist dass keine Standardwerte gesetzt werden können.

Nachfolgend beschrieben ist eine Klasse die es ermöglich Standardwerte per Attribut zu setzten.

Verwendungsbeispiel:

Public Class [MyClass]
Inherits AutomaticProperties
<DefaultValue(True)> _
Public Property boolWert() As Boolean
Get
End Get
Set
End Set
End Property

<DefaultValue(666)> _
Public Property intWert() As Integer
Get
End Get
Set
End Set
End Property

<DefaultValue("Günther")> _
Public Property stringWert() As String
Get
End Get
Set
End Set
End Property
End Class
Imports System.ComponentModel
Imports System.Reflection

Namespace gfoidl.Tools
    Public Class AutomaticProperties
        ''' <summary>
        ''' Weist die Standardwerte den Eigenschaften zu.
        ''' </summary>
        ''' <param name="o">
        ''' Die Klasse bzw. die Instanz davon dessen Eigenschaften
        ''' gesetzt werden soll
        ''' </param>
        Public Overridable Sub InitDefaults(o As Object)
            ' Alle Eigenschaften holen:
            Dim propteryInfos As PropertyInfo() = o.GetType().GetProperties(BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.Static)
            
            ' Alle Eigenschaften durchlaufen:
            For Each pi As PropertyInfo In propteryInfos
                ' Nur wenn ein Attribut gesetzt ist:
                If pi.GetCustomAttributes(True).Length > 0 Then
                    ' Attribute holen:
                    Dim attributes As Object() = pi.GetCustomAttributes(GetType(DefaultValueAttribute), True)
                    
                    If attributes IsNot Nothing Then
                        ' Das 1. Attribut holen:
                        Dim dva As DefaultValueAttribute = TryCast(attributes(0), DefaultValueAttribute)
                        
                        If dva IsNot Nothing Then
                            pi.SetValue(o, dva.Value, Nothing)
                        End If
                    End If
                End If
            Next
        End Sub
        '---------------------------------------------------------------------
        ''' <summary>
        ''' Der Konstruktor wird immer als ersters aufgerufen wenn von dieser
        ''' Klasse abgeleitet wird!
        ''' </summary>
        Public Sub New()
            InitDefaults(Me)
        End Sub
    End Class
End Namespace

1 Kommentare zum Snippet

Volker Steitz schrieb am 10/8/2008:
Sehr praktisch!!!
 

Logge dich ein, um hier zu kommentieren!