using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
class Foo
{
public Foo(string value) { Value = value; }
public string Value { get; private set; }
}
public class Test
{
public static void Main()
{
IEnumerable<Foo> collection = new[] { new Foo("zyx"), new Foo("abc") };
IEnumerable<Foo> ordered = OrderBy(collection, "Value");
ordered.Select(f => f.Value).ToList().ForEach(Console.WriteLine);
}
public static IEnumerable<T> OrderBy<T>(IEnumerable<T> collection,
string columnName)
{
ParameterExpression param = Expression.Parameter(typeof(T), "x"); // x
Expression property = Expression.Property(param, columnName); // x.ColumnName
Func<T, object> lambda = Expression.Lambda<Func<T, object>>( // x => x.ColumnName
Expression.Convert(property, typeof(object)),
param)
.Compile();
Func<IEnumerable<T>, Func<T, object>, IEnumerable<T>> expression = (c, f) => c.OrderBy(f);
IEnumerable<T> sorted = expression(collection, lambda);
return sorted;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5MaW5xLkV4cHJlc3Npb25zOwoKY2xhc3MgRm9vCnsKICAgIHB1YmxpYyBGb28oc3RyaW5nIHZhbHVlKSB7IFZhbHVlID0gdmFsdWU7IH0KICAgIHB1YmxpYyBzdHJpbmcgVmFsdWUgeyBnZXQ7IHByaXZhdGUgc2V0OyB9Cn0KCnB1YmxpYyBjbGFzcyBUZXN0CnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQlJRW51bWVyYWJsZTxGb28+IGNvbGxlY3Rpb24gPSBuZXdbXSB7IG5ldyBGb28oInp5eCIpLCBuZXcgRm9vKCJhYmMiKSB9OwogICAgICAgICAgICAgICAgSUVudW1lcmFibGU8Rm9vPiBvcmRlcmVkID0gT3JkZXJCeShjb2xsZWN0aW9uLCAiVmFsdWUiKTsKICAgICAgICAgICAgICAgIG9yZGVyZWQuU2VsZWN0KGYgPT4gZi5WYWx1ZSkuVG9MaXN0KCkuRm9yRWFjaChDb25zb2xlLldyaXRlTGluZSk7Cgl9CgogICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxUPiBPcmRlckJ5PFQ+KElFbnVtZXJhYmxlPFQ+IGNvbGxlY3Rpb24sIAogICAgICAgICAgIHN0cmluZyBjb2x1bW5OYW1lKQogICAgewogICAgICAgIFBhcmFtZXRlckV4cHJlc3Npb24gcGFyYW0gPSBFeHByZXNzaW9uLlBhcmFtZXRlcih0eXBlb2YoVCksICJ4Iik7ICAgLy8geAogICAgICAgIEV4cHJlc3Npb24gcHJvcGVydHkgPSBFeHByZXNzaW9uLlByb3BlcnR5KHBhcmFtLCBjb2x1bW5OYW1lKTsgICAgICAgLy8geC5Db2x1bW5OYW1lCiAgICAgICAgRnVuYzxULCBvYmplY3Q+IGxhbWJkYSA9IEV4cHJlc3Npb24uTGFtYmRhPEZ1bmM8VCwgb2JqZWN0Pj4oICAgICAgICAvLyB4ID0+IHguQ29sdW1uTmFtZQogICAgICAgICAgICAgICAgRXhwcmVzc2lvbi5Db252ZXJ0KHByb3BlcnR5LCB0eXBlb2Yob2JqZWN0KSksCiAgICAgICAgICAgICAgICBwYXJhbSkKICAgICAgICAgICAgLkNvbXBpbGUoKTsKCiAgICAgICAgRnVuYzxJRW51bWVyYWJsZTxUPiwgRnVuYzxULCBvYmplY3Q+LCBJRW51bWVyYWJsZTxUPj4gZXhwcmVzc2lvbiA9IChjLCBmKSA9PiBjLk9yZGVyQnkoZik7CiAgICAKICAgICAgICBJRW51bWVyYWJsZTxUPiBzb3J0ZWQgPSBleHByZXNzaW9uKGNvbGxlY3Rpb24sIGxhbWJkYSk7CiAgICAgICAgcmV0dXJuIHNvcnRlZDsKICAgIH0KfQ==