Pouvez-vous améliorer ce générique? J'essaie de réduire le gonflement du code, de réduire les erreurs et de simplifier le code behind en utilisant des génériques. Dans ce cas, j'applique des génériques à la déclaration de propriétés persistantes. La persistance est implémentée par My.Settings. Voici le code jusqu'à présent.Meilleure façon dans VB.Net d'utiliser des génériques pour My.Settings Persistance?
' must be defined in same project as My.Settings!
Public Class MySettingsProperty(Of T)
Implements System.ComponentModel.INotifyPropertyChanged
Private m_Name As String
Sub New(ByVal Name As String)
m_Name = Name
End Sub
Sub New(ByVal Name As String, ByVal InitialValue As T)
m_Name = Name
Value = InitialValue
End Sub
Public Property Value As T
Get
Return CType(My.Settings(m_Name), T)
End Get
Set(ByVal value As T)
My.Settings(m_Name) = value
RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("Value"))
End Set
End Property
Private Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
End Class
Utilisation:
Public Property Host As New MySettingsProperty(Of String)("Host")
Host.Value = "127.0.0.1"
Debug.WriteLine(Host.Value)
Avantages:
- Utilise My.Settings pour persistence
- Réduit le code derrière ballonnement de accesseurs
- réduit les erreurs de codage
- Bindable
- Met en œuvre INotifiyPropertChanged
Inconvénients
- besoin d'ajouter ".Value" aux propriétés.
- Vous devez spécifier le nom de la propriété My.Settings en tant que constante de chaîne.
- La classe doit résider dans le même projet que les déclarations My.Settings.
Je ne suis pas sûr que les avantages l'emportent sur les inconvénients sur celui-là, l'exigence .value serait un problème, et avoir toutes ces chaînes qui traînent n'est pas trop grand non plus. Personnellement, je voudrais juste éviter toute la classe "MySettings" et rouler la vôtre. Je n'ai jamais vraiment aimé comment MS gère la configuration. – DarinH
Vous pouvez simplement définir un objet et utiliser le sérialiseur DataContract pour le sérialiser/le désérialiser. – DarinH