Order by usando Reflection em C#

Neste post mostrarei como usar Reflection para ordenar qualquer lista, através de um campo string passado via parâmetro.

Para desenvolver o grid do qual falei no primeiro post, precisei implementar a seguinte solução: um método que ordenasse qualquer lista de acordo com um campo informado, no caso, o campo seria a coluna que o usuário está ordenando o grid, que seria uma string contendo o nome do campo, passada via post para minha action.

Para ser usado pelo grid, criei uma DLL com uma classe e as seguintes implementações:

using System.Web.Mvc;

private static object GetPropertyValue(object obj, string property)
{
    System.Reflection.PropertyInfo propertyInfo = obj.GetType().GetProperty(property);
    return propertyInfo.GetValue(obj, null);
}
public static dynamic NomeDoMetodo <T>(FormCollection meuFormulario, IEnumerable<T> listaDesconhecida)
{
    var campoOrdenar = meuFormulario["campoOrdenar"];
    var listaOrdenada = listaDesconhecida.OrderBy(o => GetPropertyValue(o, campoOrdenar)).ToList();
    dynamic dadosRetorno = new
    {
        resultado = listaOrdenada
    };
    return dadosRetorno;
}

Com esta implementação é possível ordenar uma lista com tipo desconhecido e ordenar por um campo de forma dinâmica, sem conhecer o campo no qual se quer ordenar.

Foi incluída a referência de System.Web.MVC para a ClassLibrary reconhecer o FormCollection e no caso estou retornando um dynamic, pois não conheço o tipo da lista e é o tipo que me atende no grid.

Na aplicação que estiver usando o grid, a chamada a essa função ficará da seguinte forma na ActionResult:

var resultado = NomeDaClassLibrary.NomeDaClasse.NomeDoMetodo(seuFormulario, suaLista);

Simples de se usar e funciona muito bem. Espero que tenha sido útil essa dica, abraços!

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s