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?