C# 匹配字符串时如何选择lambda表达式中选择器的属性
所以我有一个控制器,它接受一个字符串 我的控制器:C# 匹配字符串时如何选择lambda表达式中选择器的属性,c#,asp.net,C#,Asp.net,所以我有一个控制器,它接受一个字符串 我的控制器: public async Task<ViewResult> ActivityManagementTwo(DateFilterModel filters, int pageSize = 25, int page = 1, string sortBy = "") { // do stuff Activities = activities.OrderBy(a=> a.
public async Task<ViewResult> ActivityManagementTwo(DateFilterModel filters, int pageSize = 25, int page = 1, string sortBy = "")
{
// do stuff
Activities = activities.OrderBy(a=> a.GetType().GetProperty(sortBy)).Skip((page-1)*pageSize).Take(pageSize),
// do more stuff
}
但我不想为活动中的每个属性单独声明if。有没有一种方法可以通过与字符串匹配的属性进行排序 对于这种情况,应该使用c中的表达式 您可以使用如下扩展方法:
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, bool descending)
{
var type = typeof(T);
var property = type.GetProperty(ordering);
var parameter = Expression.Parameter(type, "p");
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExp = Expression.Lambda(propertyAccess, parameter);
MethodCallExpression resultExp =
Expression.Call(typeof(Queryable), (descending ? "OrderByDescending" : "OrderBy"),
new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
return (IOrderedQueryable<T>)source.Provider.CreateQuery<T>(resultExp);
}
您可以使用反射来获取属性名称
activites= activities.OrderBy(a => a.GetType().GetProperty(sortBy).GetValue(a, null)).Skip((page-1)*pageSize).Take(pageSize);
请参阅有关的更多选项和讨论
activites= activities.OrderBy(a => a.GetType().GetProperty(sortBy).GetValue(a, null)).Skip((page-1)*pageSize).Take(pageSize);