Если это ваше требование только, быстрый способ (а не более сложный, который я связал) - это получить доступ к свойствам путем отражения. Этот метод расширения даст вам основы того, что вам нужно:
public static class EnumerablePropertyAccessorExtensions
{
public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> enumerable, string property)
{
return enumerable.OrderBy(x => GetProperty(x, property));
}
private static object GetProperty(object o, string propertyName)
{
return o.GetType().GetProperty(propertyName).GetValue(o, null);
}
}
Example on Fiddle
Или (немного оптимизирован), как это:
public static class EnumerablePropertyAccessorExtensions
{
public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> enumerable, string property)
{
var prop = typeof(T).GetProperty(property);
return enumerable.OrderBy(x => GetProperty(x, prop));
}
private static object GetProperty(object o, PropertyInfo property)
{
return property.GetValue(o, null);
}
}
Example on Fiddle
Этот метод расширения может затем называть IEnumerable<>
следующим образом:
filtered = GetUserList().OrderBy("Name").ToList();
Обратите внимание, что эта реализация на самом деле не оптимизирована или не защищена от ошибок. Возможно, вы захотите это сделать, если это то, что вам нужно.
В чем проблема с тем, что имеете? – Guy
«общий» может быть неправильным термином здесь. Судя по вашему коду, вы пытаетесь заказать список по свойству, переданному в виде строки. –
Мне нужно сортировать по заданному значению (поле), но каждый раз каждый раз, поэтому мне нужно сделать это в общем виде. поэтому я попытался создать метод sortBy для этой команды, но он не работает. – kostas