1

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

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

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

4

2 回答 2

1

这是基于我对问题的(错误)理解的解决方案。它为您可能希望通过以下方式订购的OrderBy每个属性提供:prop

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
    }
}
于 2013-03-11T22:27:48.083 回答
1

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

于 2013-03-11T21:02:24.157 回答