如何订购通用列表(当T是一个类时)通过它的一个属性

本文关键字:一个 属性 何订购 列表 | 更新日期: 2023-09-27 18:08:24

很短,我不确定是否可能,而且我找不到一个例子。

void Order<T>(List<T> lista)
{
    // get all properties, T is always a class
    List<PropertyInfo> props = typeof(T).GetProperties().ToList();
    // just order by one property, let's say: props[0]
    List<T> oList = lista.OrderBy( /* props[0] */ );
}

只是想要新的有序列表。

如何订购通用列表<T>(当T是一个类时)通过它的一个属性

使用本博客中的代码会产生以下扩展方法:

public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> entities, string propertyName)
{
    if (!entities.Any() || string.IsNullOrEmpty(propertyName))
        return entities;
    var propertyInfo = entities.First().GetType().GetProperty(propertyName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
    return entities.OrderBy(e => propertyInfo.GetValue(e, null));
}

现在你可以这样做:

lista.OrderBy(props[0].Name).ToList();

我认为这应该工作(如果属性数组不是空的)

List<T> oList = lista.OrderBy(item => props[0].GetValue(item)).ToList();

在Mono上,没有GetValue的重载,它只接受一个参数。

List<T> oList = lista.OrderBy(item => props[0].GetValue(item, null)).ToList();