using System.Collections.Generic;
using System.Linq.Expressions;
public static void Main()
var list = Enumerable.Range(1, 5).Select(i => new Test
Num = i, Str = i.ToString(), NormalDate = DateTime.Now.AddDays(i), NullableDate = DateTime.Now.AddDays(-i)}).ToList();
foreach (var item in list)
Console.WriteLine("Order by NullableDate: NUllable<DateTime>");
foreach (var item in list.OrderBy(Selector<Test, DateTime?>("NullableDate")))
Console.WriteLine("Order by descending NormalDate: DateTime");
foreach (var item in list.OrderByDescending(Selector<Test, DateTime>("NormalDate")))
Console.WriteLine("Order by descending Num: int");
foreach (var item in list.OrderByDescending(Selector<Test, int>("Num")))
Console.WriteLine("Order by descending Str: string");
foreach (var item in list.OrderByDescending(Selector<Test, string>("Str")))
public static Func<T, TPropType> Selector<T, TPropType>(string prop)
var param = Expression.Parameter(type);
return Expression.Lambda<Func<T, TPropType>>(Expression.Property(param, type.GetProperty(prop)), param).Compile();
public DateTime NormalDate
public DateTime? NullableDate
public override string ToString()
return string.Format("Num: {0} ; Str: {1} ; NormalDate: {2:d} ; NullableDate: {3:d}", Num, Str, NormalDate, NullableDate);