Pregunta

¿Se puede mejorar este genérico?

Estoy tratando de reducir la hinchazón de código, reducir los errores y simplificar el código subyacente mediante el uso de los genéricos. En este caso estoy aplicando a los genéricos declaración de propiedades con persistencia. Persistencia es implementado por My.Settings. Aquí está el código hasta el momento.

' 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

Uso:

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

Ventajas:

  1. Usos My.Settings de persistencia
  2. Reduce el código detrás de la hinchazón de los captadores y definidores
  3. reduce los errores de codificación
  4. Bindable
  5. Instrumental INotifiyPropertChanged

Desventajas

  1. necesario añadir ".Value" a las propiedades.
  2. necesidad de especificar My.Settings nombre de la propiedad como constante de cadena.
  3. Clase debe residir en el mismo proyecto que My.Settings declaraciones.
¿Fue útil?

Solución

Yo sólo portado esto desde c# a vb así que espero que es adecuado:

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

Y uso:

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

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

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top