¿Alternativa al atributo RangeAttribute de ASP.NET?

Iniciado por Eleкtro, 23 Septiembre 2014, 21:49 PM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

¿Alguien conoce alguna alternativa al > RangeAttribute <, para WindowsForms?, me parece que .Net Framework no expone nada parecido más que para ASP.Net, pero no estoy seguro de ello.

Leí acerca de como implementar este atributo usando la librería > PostSharp <, es muy sencillo implementarlo de forma básica la verdad, pero es un producto de pago y la "medicina" no funciona muy bien, de todas formas muestro un ejemplo por si a alguien le sirve:

Código (vbnet) [Seleccionar]
''' <summary>
''' Specifies the numeric range constraints for the value of a data field.
''' </summary>
<Serializable>
Class RangeAttribute : Inherits PostSharp.Aspects.LocationInterceptionAspect

   ''' <summary>
   ''' The minimum range value.
   ''' </summary>
   Private min As Integer

   ''' <summary>
   ''' The maximum range value.
   ''' </summary>
   Private max As Integer

   ''' <summary>
   ''' Initializes a new instance of the <see cref="RangeAttribute" /> class.
   ''' </summary>
   ''' <param name="min">The minimum range value.</param>
   ''' <param name="max">The maximum range value.</param>
   Public Sub New(ByVal min As Integer, ByVal max As Integer)

       Me.min = min
       Me.max = max

   End Sub

   ''' <summary>
   ''' Method invoked <i>instead</i> of the <c>Set</c> semantic of the field or property to which the current aspect is applied,
   ''' i.e. when the value of this field or property is changed.
   ''' </summary>
   ''' <param name="args">Advice arguments.</param>
   Public Overrides Sub OnSetValue(ByVal args As PostSharp.Aspects.LocationInterceptionArgs)

       Dim value As Integer = CInt(args.Value)

       If value < min Then
           value = min

       ElseIf value > max Then
           value = max

       End If

       args.SetNewValue(value)

   End Sub

End Class


En fin, si hay que implementarlo por uno mismo sin la ayuda de herramientas de terceros pues se implementa desde cero, pero ni siquiera conozco que Class debería heredar para empezar a crear un atributo de metadatos parecido al RangeAttribute, que funcione en WinForms, apenas puedo encontrar información sobre esto en Google/MSDN y todo lo que encuentro es para ASP.Net.

PD: Actualmente hago la validación del rango en el getter/setter de las propiedades, así que eso no contaría como "alternativa" xD.

Cualquier información se agradece,
Saludos!








Novlucker

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Eleкtro

#2
Vaya, me alegra verte por aqui de nuevo NovLucker, y muchas gracias por la documentación, aunque no he sacado practicamente nada en claro.

Mi intención es transformar esto:

Código (vbnet) [Seleccionar]
Public Class MyType

''' <summary>
''' Gets or sets the value.
''' </summary>
''' <value>The value.</value>
Public Property MyProperty As Integer
   Get
       Return Me._MyValue
   End Get
   Set(ByVal value As Integer)

       If value < Me._MyValueMin Then
           If Me._MyValueThrowRangeException Then
               Throw New ArgumentOutOfRangeException("MyValue", Me._MyValueExceptionMessage)
           End If
           Me._MyValue = Me._MyValueMin

       ElseIf value > Me._MyValueMax Then
           If Me._MyValueThrowRangeException Then
               Throw New ArgumentOutOfRangeException("MyValue", Me._MyValueExceptionMessage)
           End If
           Me._MyValue = Me._MyValueMax

       Else
           Me._MyValue = value

       End If

   End Set
End Property
Private _MyValue As Integer = 0I
Private _MyValueMin As Integer = 0I
Private _MyValueMax As Integer = 10I
Private _MyValueThrowRangeException As Boolean = True
Private _MyValueExceptionMessage As String = String.Format("The valid range is beetwen {0} and {1}",
                                                          Me._MyValueMin, Me._MyValueMax)

End Class



En algo más simplificado, y sobre todo rehusable, como esto:

Código (vbnet) [Seleccionar]
Public NotInheritable Class MyType

   ''' <summary>
   ''' Gets or sets the value.
   ''' Valid range is between 0 and 10.
   ''' </summary>
   ''' <value>The value.</value>
   <RangeAttribute(0, 10, ThrowRangeException:=False, ExceptionMessage:="")>
   Public Property MyProperty As Integer

End Class



Pero no soy capaz de descubrir o entender como puedo hookear el getter/setter, apenas tengo información sobre ello, de todas formas intenté empezar a hacerlo y esto es lo que tengo, un código que no sirve para nada, porque no estoy evaluando nada, pero al menos sirve como idea inicial:

Código (vbnet) [Seleccionar]
<AttributeUsage(AttributeTargets.Property, AllowMultiple:=False)>
Public Class RangeAttribute : Inherits Attribute

   ''' <summary>
   ''' Indicates the Minimum range value.
   ''' </summary>
   Public Minimum As Single

   ''' <summary>
   ''' Indicates the Maximum range value.
   ''' </summary>
   Public Maximum As Single

   ''' <summary>
   ''' Determines whether to throw an exception when the value is not in range.
   ''' </summary>
   Public ThrowRangeException As Boolean

   ''' <summary>
   ''' Indicates the exception message to show when the value is not in range.
   ''' </summary>
   Public ExceptionMessage As String

   ''' <summary>
   ''' Initializes a new instance of the <see cref="RangeAttribute"/> class.
   ''' </summary>
   ''' <param name="Minimum">The minimum range value.</param>
   ''' <param name="Maximum">The maximum range value.</param>
   Public Sub New(ByVal Minimum As Single,
                  ByVal Maximum As Single)

       Me.New(Minimum, Maximum, ThrowRangeException:=False, ExceptionMessage:=String.Empty)

   End Sub

   ''' <summary>
   ''' Initializes a new instance of the <see cref="RangeAttribute"/> class.
   ''' </summary>
   ''' <param name="Minimum">The minimum range value.</param>
   ''' <param name="Maximum">The maximum range value.</param>
   ''' <param name="ThrowRangeException">
   ''' Determines whether to throw an exception when the value is not in range.
   ''' </param>
   Public Sub New(ByVal Minimum As Single,
                  ByVal Maximum As Single,
                  ByVal ThrowRangeException As Boolean,
                  Optional ByVal ExceptionMessage As String = "")

       Me.Minimum = Minimum
       Me.Maximum = Maximum
       Me.ThrowRangeException = ThrowRangeException

       If Not String.IsNullOrEmpty(ExceptionMessage) Then
           Me.ExceptionMessage = ExceptionMessage
       Else
           Me.ExceptionMessage = String.Format("The valid range is beetwen {0} and {1}", Minimum, Maximum)
       End If

   End Sub

End Class


Cualquier información adicional se agradece.

Un saludo!