c# - 如何根据 C# 中的字符串属性名称在 linq orderBy 中给出属性名称
问题描述
我正在根据列名进行排序功能。下降时有 24 列我正在根据进行下降的方向进行切换条件。
所以我已经指定了基于降序的切换条件,以便根据传入的列名称仅升序一个默认条件。我也不希望升序条件。在这里,我试图获取属性名称并默认按顺序传递,但它不起作用。
任何人都提供更好的解决方案
public Static List<Students> Sort( string columnname , bool direction, List<Student> students){
Switch(columnname){
case "Name" when direction= false;
students.OrderByDescending(n=> n.Name)).ToListAsync();
break;
case "Marks" when direction= false;
students.OrderByDescending(n=> n.Marks).ToListAsync();
break;
etc 25 columns
default: // trying to pass a column name dynamically but the order is not working
var getPropertyName = nameof(columnname);
students.OrderBy(n=> getPropertyName).ToListAsync(); //
尝试使用传入的属性名称。
// Used reflection
var convertProperty = typeof(Student).GetProperty(columnname);
students.OrderByDescending(n=> convertProperty)).ToListAsync();
// 但是我们执行的任何命令都不起作用
if try with a specific column name it is working
students.OrderBy(n=> n.Subjects)).ToListAsync();
students.OrderBy(n=> n.Marks)).ToListAsync();
}
return students
}
解决方案
您的倒数第二个示例实际上非常接近应该起作用的东西。
忽略它周围的所有内容,以下应该是上述示例的工作版本:
// Used reflection
var convertProperty = typeof(Student).GetProperty(columnname);
students.OrderByDescending(n => convertProperty.GetValue(n).ToString() ?? string.Empty).ToListAsync();
公平地说,我没有尝试过这段代码,所以我可能在某个地方犯了错误,因为这是在没有 IDE 的情况下自由输入的,但它应该给出一个一般的想法,对吧?
编辑
如果您使用的是 C# 6.0 及更高版本,您可以使用上面提到的 null 检查,否则您也可以使用以下
students.OrderByDescending(n => (convertProperty.GetValue(n) ?? string.Empty).ToString()).ToListAsync();
推荐阅读
- google-cloud-platform - Google Cloud Platform 上的 GPU 实例在我终止后是否会得到维护?
- python - 由于heroku数据库刷新(django后端)而丢失用户输入数据
- javascript - 在 vuejs、vuex 中获取 406(不可接受的错误)
- javascript - 处理/计算两个对象值并从中生成输出
- c++ - 面临进程退出并返回值 3221225725 的问题
- authentication - 我应该如何为 Electron 桌面应用程序实现用户身份验证/角色?
- html - 网页尺寸太宽
- java - 不关闭 PrintWriter 对象的后果
- c++ - 是否可以组合部分模板特化来生成隐式生成的共享代码路径?
- javascript - 使用react时onChange和value有什么关系?