Ver Mensaje Individual
  #3 (permalink)  
Antiguo 02/04/2009, 07:04
chcma
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 21 años, 8 meses
Puntos: 7
Respuesta: Generics - Implementar interfaz "dinámica"

Mmmm, bueno, la verdad que no lo había pensado.

Pero bueno, lo he resuelto de esta manera, os muestro la clase completa por a quien le interese, y a ti Peterpay te invito a que me des sugerencias de la clase, jejeje


Código:
Namespace HerramientasPresentacion


    ''' <summary>
    ''' Clase que realiza la ordenación de los elementos de una lista, según la propiedad enviada y según el orden indicado
    ''' </summary>
    ''' <remarks></remarks>
    Public Class ClsComparador

        Private _campoFiltro As String
        Private _ordenFiltro As EnumTipoOrden

        Private Sub New()
        End Sub

        ''' <summary>
        ''' Constructor con el que se creará la instancia de ordenación.
        ''' </summary>
        ''' <param name="campoFiltro">Nombre de la propiedad del objeto, por la cual se quiere realizar la ordenación.</param>
        ''' <param name="ordenFiltro">Orden que se quiere realizar en la ordenación</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal campoFiltro As String, ByVal ordenFiltro As EnumTipoOrden)

            Me._campoFiltro = campoFiltro
            Me._ordenFiltro = ordenFiltro
        End Sub

        Public Function Comparer(Of T)(ByVal x As T, ByVal y As T) As Integer

            Dim strDatosPropiedadX As DatosPropiedad = GetValorPropiedad(x, Me._campoFiltro)
            Dim strDatosPropiedadY As DatosPropiedad = GetValorPropiedad(y, Me._campoFiltro)

            'SI ES DE TIPO CADENA
            If (strDatosPropiedadX.EsCadena) Then

                Dim valorPrimerPatron As String = strDatosPropiedadX.ValorPropiedad.Trim()
                Dim valorSegundoPatron As String = strDatosPropiedadY.ValorPropiedad.Trim()

                'REALIZO LA COMPROBACION
                If (Me._ordenFiltro = EnumTipoOrden.Desc) Then

                    Return valorPrimerPatron.ToLower().CompareTo(valorSegundoPatron.ToLower)
                Else

                    Return valorSegundoPatron.ToLower().CompareTo(valorPrimerPatron.ToLower)
                End If
            End If


            'SI ES DE TIPO NUMERO
            If (Not strDatosPropiedadX.EsCadena) Then

                Dim valorPrimerPatron As String = strDatosPropiedadX.ValorPropiedad
                Dim valorSegundoPatron As String = strDatosPropiedadY.ValorPropiedad

                If (Me._ordenFiltro = EnumTipoOrden.Desc) Then

                    Return valorPrimerPatron - valorSegundoPatron
                Else

                    Return valorPrimerPatron + valorSegundoPatron
                End If
            End If
        End Function


        Private Function GetValorPropiedad(ByVal objObjeto As Object, ByVal nombrePropiedad As String) As DatosPropiedad

            Dim strDatosPropiedad As New DatosPropiedad
            Dim arrayPropiedades() As String = nombrePropiedad.Split("."c)

            If (arrayPropiedades.Length > 1) Then

                Dim objPropiedad As Object = (objObjeto.GetType().GetProperty(arrayPropiedades(0)).GetValue(objObjeto, Nothing))
                If ((objPropiedad.GetType().GetProperty(arrayPropiedades(1)).GetValue(objPropiedad, Nothing)) IsNot Nothing) Then

                    strDatosPropiedad.ValorPropiedad = (objPropiedad.GetType().GetProperty(arrayPropiedades(1)).GetValue(objPropiedad, Nothing)).ToString().ToLower()
                End If
                strDatosPropiedad.EsCadena = (objPropiedad.GetType().GetProperty(arrayPropiedades(1)).PropertyType.ToString() = "System.String")
            Else

                strDatosPropiedad.ValorPropiedad = (objObjeto.GetType().GetProperty(arrayPropiedades(0)).GetValue(objObjeto, Nothing)).ToString().ToLower()
                strDatosPropiedad.EsCadena = (objObjeto.GetType().GetProperty(arrayPropiedades(0)).PropertyType.ToString() = "System.String")
            End If

            Return strDatosPropiedad

        End Function

        Private Structure DatosPropiedad

            Private _ValorPropiedad As String
            Private _EsCadena As Boolean

            Public Property ValorPropiedad()
                Get

                    If (_ValorPropiedad Is Nothing) Then

                        Return String.Empty
                    End If
                    Return Me._ValorPropiedad
                End Get
                Set(ByVal value)

                    Me._ValorPropiedad = value
                End Set
            End Property
            Public Property EsCadena() As Boolean
                Get

                    Return Me._EsCadena
                End Get
                Set(ByVal value As Boolean)

                    Me._EsCadena = value
                End Set
            End Property
        End Structure
    End Class

    Public Enum EnumTipoOrden
        Asc = 0
        Desc = 1
    End Enum

End Namespace
USO:
Código:
Me.ListaMedicos.Sort(AddressOf New HerramientasPresentacion.ClsComparador("NombreMedico", EnumTipoOrden.Asc).Comparer)
Saludos, y gracias.

Pd.: En cuant tenga tiempo también voy a probar lo que me has comentado de la interfaz, haber si soy capaz de hacerlo funcionar asi, aun que, creo que asi, tampoco esta mal, ¿No crees?
__________________
Charlie.