我有一个我需要订购的清单,例如。
var list = someelements;
我还有一个参数,用于说明我应该按哪个属性和方向列出数据,例如。
var sortby = "Name";
var sortdirection = "desc";
我想知道我是否可以将字符串属性名称与正确的属性匹配,所以我得到:
var list = someelements.OrderBy(x => x.Name).ToList();
当sortby == "Name"
无需使用switch循环来检查属性名称并为OrderBy分配正确的属性时。
我希望选择OrderBy
或OrderByDescending
,这取决于我是sortdirection = "asc"
还是sortdirection = "desc"
是否可能,如果可以,怎么样?
答案 0 :(得分:5)
你可以通过Nuget获得Dynamic Linq
。然后你可以使用.OrderBy(sortby + " " + sortdirection)
。
以下是链接:Dynamic Linq。
答案 1 :(得分:4)
以下是一个不使用Dynamic Linq的解决方案:
public class Helper
{
public static IEnumerable<T> OrderByDynamic<T>(IEnumerable<T> items, string sortby, string sort_direction)
{
var property = typeof (T).GetProperty(sortby);
var result = typeof(Helper)
.GetMethod("OrderByDynamic_Private", BindingFlags.NonPublic | BindingFlags.Static)
.MakeGenericMethod(typeof (T), property.PropertyType)
.Invoke(null, new object[]{ items, sortby, sort_direction});
return (IEnumerable<T>)result;
}
private static IEnumerable<T> OrderByDynamic_Private<T,TKey>(IEnumerable<T> items, string sortby, string sort_direction)
{
var parameter = Expression.Parameter(typeof (T), "x");
Expression<Func<T, TKey>> property_access_expression =
Expression.Lambda<Func<T, TKey>>(
Expression.Property(parameter, sortby),
parameter);
if (sort_direction == "asc")
{
return items.OrderBy(property_access_expression.Compile());
}
if (sort_direction == "desc")
{
return items.OrderByDescending(property_access_expression.Compile());
}
throw new Exception("Invalid Sort Direction");
}
}
你可以像这样使用它:
var result = Helper.OrderByDynamic(list, "Name", "desc").ToList();