变量TKey的订单

本文关键字:TKey 变量 | 更新日期: 2023-09-27 18:03:19

我有一个FileInfo列表,我必须按不同的属性排序,例如

List<FileInfo> infoListOrdered = infoList.OrderBy(x => x.CreationTime).ToList();

而不是为每个FileInfo属性编写表达式,是否可以将TKey作为参数传递?

变量TKey的订单

不,TKey为类型;λ x=>x.CreationTime是值选择器,返回类型为TKey的值。您不能仅根据其类型选择某些东西,例如,在您的类中可能存在该类型的多个属性实例。

根据我对这个问题的(错误)理解,我给出了一个解决方案。它为您可能想要排序的每个属性prop提供OrderBy:

static void Main()
{
    IEnumerable<FileInfo> infoList = XXX; // your source to sort
    var orderByMeth = typeof(Enumerable).GetMethods().Single(m => m.Name == "OrderBy" && m.GetParameters().Length == 2);
    var tFileInfo = typeof(FileInfo);
    foreach (var prop in tFileInfo.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance))
    {
        var tKey = prop.PropertyType;
        var xParam = Expression.Parameter(tFileInfo);
        var propBody = Expression.Property(xParam, prop.GetMethod);
        var lambda = Expression.Lambda(propBody, xParam);
        var func = lambda.Compile();
        var orderByMethConstr = orderByMeth.MakeGenericMethod(tFileInfo, tKey);
        var result = orderByMethConstr.Invoke(null, new object[] { infoList, func, });
        var infoListOrdered = (IOrderedEnumerable<FileInfo>)result;
        // keep infoListOrdered; foreach through it to get that particular ordering
    }
}