using System.Collections.Generic;
using System.Linq.Expressions;
public static void Main()
Console.WriteLine("----Ordery by StudentName----");
var data = new[] { new Student { StudentName = "B" }, new Student { StudentName = "A" }, new Student { StudentName = "C" } };
foreach(var student in OrderDynamic<Student>(data, "StudentName")){
Console.WriteLine(student.StudentName);
Console.WriteLine("----Ordery by Age----");
var data2 = new[] { new Student { StudentName = "B", Age = 2 }, new Student { StudentName = "A", Age = 3 }, new Student { StudentName = "C", Age = 1 } };
foreach(var student in OrderDynamic<Student>(data2, "Age")){
Console.WriteLine(student.Age);
public static IEnumerable<T> OrderDynamic<T>(IEnumerable<T> Data, string propToOrder)
var param = Expression.Parameter(typeof(T));
var memberAccess = Expression.Property(param, propToOrder);
var convertedMemberAccess = Expression.Convert(memberAccess, typeof(object));
var orderPredicate = Expression.Lambda<Func<T, object>>(convertedMemberAccess, param);
return Data.AsQueryable().OrderBy(orderPredicate).ToArray();
public int StudentID { get; set; }
public string StudentName { get; set; }
public int Age { get; set; }