首页 > 解决方案 > 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.'

是否可以通过反射来做到这一点,如果可以,有人可以解释一下,我做错了什么吗?

标签: c#linqreflectionentity

解决方案


推荐阅读