Если вы хотите эту функциональность, загляните в статью ScottGu о Dynamic Linq Library . Я верю, что это будет делать то, что вы хотите.
Хотя лямбда-типы безопасны по типу, бывают ситуации, когда вам может потребоваться сгенерировать запрос на лету, а не иметь все возможные комбинации, которые пользователь может отсортировать, например.
Редактировать
Я исправил твой метод. По сути, вам нужно создать выражение для каждого члена доступа.
public static IEnumerable<T> Sort<T>(this IEnumerable<T> source, string sortExpression, bool desc)
{
var param = Expression.Parameter(typeof(T), string.Empty);
try
{
var fields = sortExpression.Split('.');
Expression property = null;
Expression parentParam = param;
foreach (var field in fields)
{
property = Expression.Property(parentParam, field);
parentParam = property;
}
var sortLambda =
Expression.Lambda<Func<T, object>>(
Expression.Convert(property, typeof(object)), param);
if (desc)
{
return source.AsQueryable<T>().
OrderByDescending<T, object>(sortLambda);
}
return source.AsQueryable<T>().
OrderBy<T, object>(sortLambda);
}
catch (ArgumentException)
{
throw;
}
}