如何在linq顺序中根据c#中的字符串属性名给出属性名



我正在做基于列名称的排序功能。有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();

您可以很容易地使用这段代码:

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

相关内容

  • 没有找到相关文章

最新更新