我有一个需要订购的清单。
var list = someelements;
Run Code Online (Sandbox Code Playgroud)
我也有一个参数,该参数指示应按哪个属性和哪个方向订购列表数据,例如。
var sortby = "Name";
var sortdirection = "desc";
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以将字符串属性名称与正确的属性匹配,以便得到:
var list = someelements.OrderBy(x => x.Name).ToList();
Run Code Online (Sandbox Code Playgroud)
当sortby == "Name"
不需要使用switch循环来检查属性名称并将正确的属性分配给OrderBy时。
同样的,我想有选择,以实现OrderBy
或OrderByDescending
取决于我是否可以得到sortdirection = "asc"
或sortdirection = "desc"
有可能吗?如果可以,怎么办?
这是一种不使用 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");
}
}
Run Code Online (Sandbox Code Playgroud)
你可以这样使用它:
var result = Helper.OrderByDynamic(list, "Name", "desc").ToList();
Run Code Online (Sandbox Code Playgroud)