如何根据C#中的字符串属性名称在linq orderBy中给出属性名称

时间:2021-01-20 20:00:30

标签: c# system.reflection c#-9.0 c#-7.1

我正在根据列名进行排序功能。下降时有 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

}

2 个答案:

答案 0 :(得分:1)

倒数第二个例子实际上非常接近应该起作用的东西。

忽略它周围的一切,以下应该是上述示例的工作版本:

// Used reflection 
var convertProperty = typeof(Student).GetProperty(columnname);
students.OrderByDescending(n => convertProperty.GetValue(n).ToString() ?? string.Empty).ToListAsync();

公平地说,我还没有尝试过这段代码,所以我可能在某处犯了错误,因为这是在没有 IDE 的情况下自由输入的,但它应该给出一个大致的想法,对吧?

编辑

如果您使用的是 C# 6.0 及更高版本,您可以使用上面提到的空检查,否则您也可以使用以下内容

students.OrderByDescending(n => (convertProperty.GetValue(n) ?? string.Empty).ToString()).ToListAsync();

答案 1 :(得分:0)

您可以轻松使用此代码:

students = students.OrderByDescending(x => x.GetType().GetProperty(columnname).GetValue(x, null)).ToList();
相关问题