按属性名称(字符串值)排序列表?

我有一个object列表。 如何使用属性名称订购此列表?

 string orderbyField = "Code"; List l = FillList(); l = l.OrderBy(o => orderbyField); 

我可以针对此问题进行扩展吗?

如果您不必将属性名称作为字符串提供,则使用dynamic非常简单:

 List l = FillList(); l = l.OrderBy(o => ((dynamic)o).Id); 

如果属性名称必须是一个字符串,那么它会变得有点复杂,但可以使用reflection完成(虽然效率不高):

 l = l.OrderBy(o => o.GetType() .GetProperty("Code") .GetValue(o, null)); 

您还应考虑添加一些error handling,例如,如果该属性不存在。

此外,如果列表中的所有元素都具有相同的运行时类型,那么使用表达式树重新编译getter函数并重用它(而不是直接使用reflection)会更有效。

 public static Func 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)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));