我有一个记录的类列表,因此用户可以选择按属性名称将行动态分组。例如MenuText,RoleName或ActionName。然后,我必须执行分组,因此我需要一个通用的方法来通过传递列名来处理分组。
MenuText
RoleName
ActionName
范例:
public class Menu { public string MenuText {get;set;} public string RoleName {get;set;} public string ActionName {get;set;} } public class Menus { var list = new List<Menu>(); list.Add( new Menu {MenuText="abc",RoleName ="Admin", ActionName="xyz"}; list.Add( new Menu {MenuText="abc",RoleName ="Admin", ActionName="xyz"}; list.Add( new Menu {MenuText="abc1",RoleName ="Admin1", ActionName="xyz1"}; list.Add( new Menu {MenuText="abc1",RoleName ="Admin1", ActionName="xyz1"}; /// columnName :- Name of the Menu class ( MenuText or RoleName or ActionName) public IEnumerable<IGrouping<string,IEnumerable<Menu>>> GroupMenu(string columnName) { // Here I want to get group the list of menu by the columnName } }
如果您不使用数据库,则可以使用Reflection:
private static object GetPropertyValue(object obj, string propertyName) { return obj.GetType().GetProperty(propertyName).GetValue(obj, null); }
用作:
var grouped = enumeration.GroupBy(x => GetPropertyValue(x, columnName));
这是一个非常原始的解决方案,更好的方法应该是使用Dynamic LINQ:
var grouped = enumeration.GroupBy(columnName, selector);
编辑 动态 LINQ可能需要一些解释。它不是技术,库或全新的框架。它只是几个方便的(2000 LOC)帮助程序方法的名称,使您可以编写此类查询。只需下载它们的源代码(如果未安装VS示例),然后在代码中使用它们即可。