2013-12-10 117 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

相关问题