Order list by property name (string value)?

I have a list of object s. How can I order this list using the property name?

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

Can I get an extension for this problem?

+6
source share
1 answer

If you do not need to specify the property name as a string, it is quite simple using dynamic :

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

If the property name should be a string, then it becomes a little more complicated, but can be done using reflection (although it is not very efficient):

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

You should also consider adding some error handling, for example. if the property does not exist.

In addition, if all the items in the list have the same type of run time, it would be much more efficient to compile the getter function using expression trees and reuse (instead of directly using reflection).

 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(); } 

and use it like:

 var codeGetter = CreateGetter(l[0].GetType(), "Code"); // using the 1st element as an example l = l.OrderBy(o => codeGetter(o)); 
+15
source

Source: https://habr.com/ru/post/977456/


All Articles