2010-11-30 17 views
4

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:

  1. Utilise My.Settings pour persistence
  2. Réduit le code derrière ballonnement de accesseurs
  3. réduit les erreurs de codage
  4. Bindable
  5. Met en œuvre INotifiyPropertChanged

Inconvénients

  1. besoin d'ajouter ".Value" aux propriétés.
  2. Vous devez spécifier le nom de la propriété My.Settings en tant que constante de chaîne.
  3. La classe doit résider dans le même projet que les déclarations My.Settings.
+0

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

+0

Vous pouvez simplement définir un objet et utiliser le sérialiseur DataContract pour le sérialiser/le désérialiser. – DarinH

Répondre

0

Je viens Ported ce c#-vb si nous espérons qu'il est approprié:

Module SettingsHelper 

    Public Function GetSetting(Of TSetting)(ByVal selector As Func(Of My.MySettings, TSetting)) As TSetting 
     Return selector(My.Settings) 
    End Function 

    Public Sub SetSetting(ByVal action As Action(Of My.MySettings)) 
     action(My.Settings) 
    End Sub 

End Module 

et utilisation:

Debug.WriteLine(SettingsHelper.GetSetting(Function(s) s.Setting1)) 

SettingsHelper.SetSetting(Sub(s) s.Setting1 = "new value") 

Hope this helps.

+0

Ceci est une approche intéressante. Je ne sais pas quand je pourrai revenir à ce problème pour essayer votre code. On dirait qu'il y a beaucoup à modifier et à évaluer pour ma situation. Je vais le marquer comme la réponse jusqu'à ce que je puisse vérifier ou non. – BSalita

+0

@BSalita - Je serais intéressé de voir ce que vous venez de trouver! – aligray