2013-03-11 87 views
0

我有一個FileInfo列表,我必須按不同的屬性排序,例如:OrderBy with variable TKey

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

而不是寫表達對每一個FileInfo的財產,將有可能通過t鍵作爲參數?

+5

你是什麼意思? 'TKey'是一個類型參數...你想要做什麼? – 2013-03-11 20:47:00

+0

對於'typeof(FileInfo).GetProperties()'中的每個屬性,您是否打算使用'OrderBy'屬性?爲什麼?你需要所有那些有序的名單? – 2013-03-11 20:56:45

回答

0

不,TKey是一種類型; lamba x=>x.CreationTime是返回值類型TKey的值選擇器。你不能僅僅根據它的類型來選擇某個東西,因爲你的類中可能有多個這種類型的屬性實例。

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 
    } 
} 
相關問題