c# - C# - 通过反射按属性排序
问题描述
我有一个数据库查询为我提供IQueryable对象,其中T是匿名数据类型,如下所示:
var baseListQuery = (<...> select new {
note = n, // class Note
triggers = grp // class Trigger
})
现在我想按Note的不同属性(例如Note.Title)对其进行排序,但我的Note类可以包含许多不同的属性。用作排序元素的属性可以在外部更改,并且我将作为简单字符串接收有关使用哪个属性的信息。目前我正在使用switch-case语句来评估接收到的字符串,然后选择适当的属性进行排序:
switch(SortBy) {
...
case "Title": baseListQuery = baseListQuery.OrderBy(p => p.note.Title); break;
...
}
但是,我想知道是否可以使用反射以更一般的方式来实现它?我想检查Note是否包含带有接收到的字符串名称的属性,如果是,请对结果进行适当的排序。我尝试过这样的事情:
var baseQueryType = baseListQuery.GetType();
var member = (baseQueryType.GetGenericArguments()[0]).GetProperty("note");
var member2 = member.PropertyType.GetProperty("Title"); // I would like to use GetProperty(SortBy);
baseListQuery = baseListQuery.OrderBy(p => member2);
例如调用baseListQuery.Count()时会引发异常:
System.NotSupportedException: 'Unable to create a constant value of type 'System.Reflection.PropertyInfo'. Only primitive types or enumeration types are supported in this context.'
是否可以通过反射来做到这一点,如果可以,有人可以解释一下,我做错了什么吗?
解决方案
推荐阅读
- swiftui - 从坐标 swiftui 更改状态栏颜色和文本颜色
- python - 确定按“年份”分组的出现次数 - 续
- lighthouse - PageSpeed Insight - 避免巨大的网络负载 - 重复资产
- python - django:__init__() 缺少 1 个必需的位置参数:“用户”
- django - 基于 ManyToManyField 值的 Django Order QuerySet
- javascript - 自动编号不适用于添加的行
- reactjs - 无法读取未定义的属性“isAuthenticated”
- visual-studio-code - vscode 问题,python 扩展永远加载
- storybook - 隐藏故事书“新版本可用”弹出窗口?
- html - 在 google colab 上使用 Flask 发布图像