我有一个FileInfo列表,我必须按不同的属性排序,例如
List<FileInfo> infoListOrdered = infoList.OrderBy(x => x.CreationTime).ToList();
不是为每个FileInfo属性编写表达式,而是可以将TKey作为参数传递吗?
答案 0 :(得分:0)
不,TKey
是一种类型; lamba x=>x.CreationTime
是值选择器,返回类型TKey
的值。您不能仅根据其类型选择某些内容,因为您的类中可能有多个该类型的属性实例。
答案 1 :(得分:0)
这是基于我(错误)理解问题的解决方案。它为您可能想要订购的每个属性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
}
}