我有一个数据库查询,提供 IQueryable 对象,其中 T 是匿名数据类型,如下所示:
>>> file_names = os.popen('find . -name "*%s*"' % criteria).read().split('\n')
>>>
>>>
>>> for file in file_names: print(file)
...
./pymp-0kz_4tay
./pymp-4zfymo3o
./pymp-k79d3tvz
./pymp-wq9g900h
现在我想通过 Note 的不同属性(例如 Note.Title )对此进行排序,但我的 Note 类可以包含大量的不同的属性。用作排序元素的属性可以在外部更改,有关使用哪个属性的信息我将作为简单字符串接收。目前我正在使用 switch-case 语句来评估收到的字符串,然后选择适当的属性进行排序:
var baseListQuery = (<...> select new {
note = n, // class Note
triggers = grp // class Trigger
})
但是,我想知道是否有可能以更一般的方式使用反射?我想检查注意是否包含具有接收字符串名称的属性,如果是,请对结果进行适当排序。我尝试过这样的事情:
switch(SortBy) {
...
case "Title": baseListQuery = baseListQuery.OrderBy(p => p.note.Title); break;
...
}
在调用示例 baseListQuery.Count()时会引发异常:
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);
是否有可能通过反思来做到这一点,如果是这样,有人可以解释我,我做错了什么?