2013-12-10 36 views
2

有沒有什麼方法可以使這項工作。不工作的部分是粗體。從本質上講,我試圖找出一種方法,讓它通過作爲字符串傳遞的sortColumn進行排序。它希望o => o.Field不是o.String。通過字符串形式的屬性對對象排序

internal List<Apps> GetAllApps(string sortColumn) 
{ 
    List<Apps> employeeList = new List<Apps>(); 

    // Some database operations that fill employeeList 
    // with a bunch of objects from a database operations 

    if (!string.IsNullOrEmpty(sortColumn)) 
    { 
     employeeList.OrderBy(o => **o.sortColumn**).ToList(); 

    } 

    return employeeList; 
} 

回答

4

你可以嘗試這樣的事情:

var sortPropertyInfo = typeof(Apps).GetProperty(sortColumn); 

employeeList 
    .OrderBy(o => sortPropertyInfo.GetValue(o, null)) 
    .ToList(); 

一些理智的檢查可以加入。或者,考慮使用Dynamic LINQ

+1

+1提'動態LINQ'。 – Brian

+1

我真的想讓'typeof(Apps).GetProperty(sortColumn)'獲得第一個,然後被函數捕獲。 'GetProperty'不是最便宜的方法,所以我認爲不應該爲每個項目調用一次過早的優化。 –

+0

@JonHanna你說得對,謝謝:) – BartoszKP

0

您可以使用反射

employeeList.OrderBy(o => typeof(Apps).GetMethod(sortColumn).Invoke(o, null)).ToList(); 
+0

感謝您的建議。這是我在整個故障排除過程中嘗試的第一種方法。但是,它沒有按照我寫的方式工作。 – TimidObserver

0

我寧願使用Dynamic LINQ

internal List<Apps> GetAllApps(string sortColumn) 
{ 
    List<Apps> employeeList = new List<Apps>(); 
    ... 
    if (!string.IsNullOrEmpty(sortColumn)) 
    { 
     employeeList = employeeList.AsQueryable<Apps>() 
            .OrderBy(sortColumn) 
            .Cast<Apps>() 
            .ToList(); 
    } 
    return employeeList; 

}

+0

在此之前,我還沒有聽說過Dyanmic LINQ。它工作得很好,似乎是最簡單的路線。感謝您的工作示例。我現在可能會考慮學習Dyanamic Linq。 – TimidObserver

相關問題