c# - 在 linq 中动态设置 order by 子句内的键

标签 c# linq reflection

我需要使用 linq 在 OrderBy 子句中设置键,其中键是对象的属性。我身上只有特性名称。如何动态设置属性。

class Obj 
{
    string Level
    {
       get;
       set;
    }
}

List<Obj> objList;

objList.OrderByDescending(x => x.Level); => "here i only have property name."

希望大家能帮忙

谢谢 苏尼尔

最佳答案

您可以通过Extension Methods来做到这一点 Creating Expression Trees 动态地喜欢

public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> enumerable, string sortColumn)
{
    var param = Expression.Parameter(typeof(T), "x");
    var mySortExpression = Expression.Lambda<Func<T, object>>(Expression.Property(param, sortColumn), param);
    return enumerable.OrderByDescending(mySortExpression);;
 }

对于 OrderBy

public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> enumerable, string sortColumn)
{
    var param = Expression.Parameter(typeof(T), "x");
    var mySortExpression = Expression.Lambda<Func<T, object>>(Expression.Property(param, sortColumn), param);
    return enumerable.OrderBy(mySortExpression);;
 }

你可以将这两者合二为一,例如

public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> enumerable, string sortColumn, string direction)
{
     var param = Expression.Parameter(typeof(T), "x");
     var mySortExpression = Expression.Lambda<Func<T, object>>(Expression.Property(param, sortColumn), param);

      IOrderedQueryable<T> iQuery;
      switch(direction)
      {
          case "desc": 
            iQuery = enumerable.OrderByDescending(mySortExpression);
            break;
          case "asc":
          default :
            iQuery = enumerable.OrderBy(mySortExpression);
            break;
      }
      return iQuery;
 }

然后你可以这样调用它 objList.OrderBy("Level","asc")//For Ascending objList.OrderBy("Level","desc")//降序

希望对你有帮助

关于c# - 在 linq 中动态设置 order by 子句内的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12564545/

相关文章:

java - 如何修剪通过使用 Java 反射获得的同一方法的变体?

json - 从 JSON 数据生成 JSON 模式的工具

java - 以编程方式从 Android 中的 R 文件获取所有图像

C# 有时货币格式不起作用

C# ASP.NET Core 构建动态表单

c# - Linq - 从另一个列表中删除一个匿名列表

c# - 如何使 LINQ 表达式返回到类中?

c# - LINQ 不会用 float 对组求和吗?属性(property)

c# - C# 真的比说 C++ 慢吗?

c# - RichTextBox 垂直显示文本