2010-11-30 17 views
4

あなたはこの一般的なものを改善できますか?My.Settingsの永続性のためにGenericsを使用するVB.Netのベストウェイ?

私はジェネリックを使用して、コードの膨張を減らし、エラーを減らし、コードビハインドを単純化しようとしています。このケースでは、持続可能なプロパティの宣言にジェネリックを適用しています。持続性はMy.Settingsによって実装されます。ここまではコードです。

' 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 

使用法:

Public Property Host As New MySettingsProperty(Of String)("Host") 
Host.Value = "127.0.0.1" 
Debug.WriteLine(Host.Value) 

利点:

  1. は永続性
  2. ためMy.Settingsを使用しGetterおよびSetter
  3. からの肥大化の背後にあるコードは、エラー
  4. コーディング削減削減バインド可能
  5. を実装は、プロパティに ".Valueの" を追加する必要が

デメリット

  1. をINotifiyPropertChanged。
  2. My.Settingsプロパティ名を文字列定数として指定する必要があります。
  3. クラスは、My.Settings宣言と同じプロジェクトに存在する必要があります。
+0

私は賛否両論を上回っているとは思っていません。値の要件は面倒なことでしょう。個人的には、私は "MySettings"クラス全体を避け、あなた自身のロールをとっています。私はMSが設定をどのように処理するかは本当に好きではありません – DarinH

+0

オブジェクトを定義し、DataContractシリアライザを使用してシリアライズ/デシリアライズできます。 – DarinH

答えて

0

私はちょうどので、うまくいけば、それは適していc#からvbにこれを移植:

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 

と使用方法:

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

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

・ホープ、このことができます。

+0

これは興味深いアプローチです。あなたのコードを試してみるためにいつこの問題に取り掛かることができるのか分かりません。私の状況を修正したり評価したりすることはたくさんあるようです。私はそれを確認するまで答えとしてマークします。 – BSalita

+0

@BSalita - 私はあなたが思いつくものを見るのに興味があるでしょう! – aligray

関連する問題