c# – 按属性名称(字符串值)排序列表?
发布时间:2020-12-15 18:15:55 所属栏目:百科 来源:网络整理
导读:我有一个对象列表.如何使用属性名称订购此列表? string orderbyField = "Code";Listobject l = FillList();l = l.OrderBy(o = orderbyField); 我可以为此问题进行扩展吗? 解决方法 如果您不必将属性名称作为字符串提供,则使用动态非常简单: Listobject l
我有一个对象列表.如何使用属性名称订购此列表?
string orderbyField = "Code"; List<object> l = FillList(); l = l.OrderBy(o => orderbyField); 我可以为此问题进行扩展吗? 解决方法
如果您不必将属性名称作为字符串提供,则使用动态非常简单:
List<object> l = FillList(); l = l.OrderBy(o => ((dynamic)o).Id); 如果属性名称必须是一个字符串,那么它会变得有点复杂,但可以使用反射完成(虽然效率不高): l = l.OrderBy(o => o.GetType() .GetProperty("Code") .GetValue(o,null)); 您还应该考虑添加一些错误处理,例如如果财产不存在. 此外,如果列表中的所有元素具有相同的运行时类型,那么使用表达式树重新编译getter函数并重用它(而不是直接使用反射)会更有效. public static Func<object,object> CreateGetter(Type runtimeType,string propertyName) { var propertyInfo = runtimeType.GetProperty(propertyName); // create a parameter (object obj) var obj = Expression.Parameter(typeof(object),"obj"); // cast obj to runtimeType var objT = Expression.TypeAs(obj,runtimeType); // property accessor var property = Expression.Property(objT,propertyInfo); var convert = Expression.TypeAs(property,typeof(object)); return (Func<object,object>)Expression.Lambda(convert,obj).Compile(); } 并使用它像: var codeGetter = CreateGetter(l[0].GetType(),"Code"); // using the 1st element as an example l = l.OrderBy(o => codeGetter(o)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |