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