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);