传递给类的列表上的LINQ< T>[重复]

o75abkj4  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(117)

此问题在此处已有答案

How do I specify the Linq OrderBy argument dynamically? [duplicate](12个答案)
6天前关闭。
我有一个Table类,我向它传递了一个名为 data 的对象的通用列表。

public class Table<T>
{
   private List<T> _data;

   public Table(List<T> data)
   {
       _data = data;
       //other constructor stuff
   }
}

这个想法是Table类将“构建”一个表,将存储在 data 中的T类型对象的所有公共属性作为列列出。我通过执行_data[0].GetType().GetProperties()来检索属性并构建列标题来实现这一点。然后我在列标题上实现了一个click事件,以便通过单击它,数据将按此属性排序。问题就出在这里,我不能让Linq按给定的属性排序,因为在编译时,对象的类型是未知的。
我试过

_data = _data.OrderBy(e => e.GetType().GetProperty("Surname")).ToList<T>();

其中Surname是我知道我的测试对象(存储在_data中)具有的属性。
我没有得到任何错误,但似乎命令的指令没有做任何事情。出了什么问题?有没有一种不那么复杂的方法来做到这一点?(顺便说一句,我没有使用WPF,所以我想没有必要使用DataTable)。
我发现类似的问题已经得到了回答,但在所有这些问题中,List的T类型在编译时都是已知的。
谢谢你的帮助。

xqkwcwgp

xqkwcwgp1#

你可以使用PropertyInfo.GetValue

_data = _data
    .OrderBy(e => e.GetType().GetProperty("Surename").GetValue(e))
    .ToList<T>();

但一般来说,我建议你去找一些工具来避免使用反射。或者至少试着把反射从LINQ中移走:

var pi = typeof(T).GetProperty("Surename");
_data = _data
    .OrderBy(e => pi.GetValue(e))
    .ToList<T>();

或者更好地“缓存”它(看看这些答案之一-onetwo)。

相关问题