using System;
using System.Linq;
using System.Linq.Expressions;
public class Program
{
public static void Main()
{
var someClass = new SomeClass
{
PropertyOne = "Value1",
PropertyTwo = "Value2",
PropertyThree = "Value3",
PropertyFour = 4,
};
var props = new string[] { "PropertyOne", "PropertyTwo", "PropertyFour"};
var keyFactoryExp = CreateExpression<SomeClass>(props);
var keyFactory = keyFactoryExp.Compile();
Console.WriteLine(keyFactory(someClass));
}
static Expression<Func<T, string>> CreateExpression<T>(string[] props)
{
var par = Expression.Parameter(typeof(T));
return Expression.Lambda<Func<T, string>>(Expression.Call(typeof(string), "Join", Type.EmptyTypes, Expression.Constant("|"),
Expression.NewArrayInit(typeof(object), props.Select(prop => Expression.Convert(Expression.Property(par, prop), typeof(object))).ToArray())), par);
}
class SomeClass
{
public string PropertyOne { get; set; }
public string PropertyTwo { get; set; }
public string PropertyThree { get; set; }
public int PropertyFour { get; set; }
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkxpbnEuRXhwcmVzc2lvbnM7CgkJCQkJCnB1YmxpYyBjbGFzcyBQcm9ncmFtCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQl2YXIgc29tZUNsYXNzID0gbmV3IFNvbWVDbGFzcwoJCXsKCQkJUHJvcGVydHlPbmUgPSAiVmFsdWUxIiwKCQkJUHJvcGVydHlUd28gPSAiVmFsdWUyIiwKCQkJUHJvcGVydHlUaHJlZSA9ICJWYWx1ZTMiLAoJCQlQcm9wZXJ0eUZvdXIgPSA0LAoJCX07CgkJdmFyIHByb3BzID0gbmV3IHN0cmluZ1tdIHsgIlByb3BlcnR5T25lIiwgIlByb3BlcnR5VHdvIiwgIlByb3BlcnR5Rm91ciJ9OwoJCXZhciBrZXlGYWN0b3J5RXhwID0gQ3JlYXRlRXhwcmVzc2lvbjxTb21lQ2xhc3M+KHByb3BzKTsKCQl2YXIga2V5RmFjdG9yeSA9IGtleUZhY3RvcnlFeHAuQ29tcGlsZSgpOwoJCUNvbnNvbGUuV3JpdGVMaW5lKGtleUZhY3Rvcnkoc29tZUNsYXNzKSk7Cgl9CgoKCXN0YXRpYyBFeHByZXNzaW9uPEZ1bmM8VCwgc3RyaW5nPj4gQ3JlYXRlRXhwcmVzc2lvbjxUPihzdHJpbmdbXSBwcm9wcykKCXsKCQl2YXIgcGFyID0gRXhwcmVzc2lvbi5QYXJhbWV0ZXIodHlwZW9mKFQpKTsKCQlyZXR1cm4gRXhwcmVzc2lvbi5MYW1iZGE8RnVuYzxULCBzdHJpbmc+PihFeHByZXNzaW9uLkNhbGwodHlwZW9mKHN0cmluZyksICJKb2luIiwgVHlwZS5FbXB0eVR5cGVzLCBFeHByZXNzaW9uLkNvbnN0YW50KCJ8IiksCgkJCUV4cHJlc3Npb24uTmV3QXJyYXlJbml0KHR5cGVvZihvYmplY3QpLCBwcm9wcy5TZWxlY3QocHJvcCA9PiBFeHByZXNzaW9uLkNvbnZlcnQoRXhwcmVzc2lvbi5Qcm9wZXJ0eShwYXIsIHByb3ApLCB0eXBlb2Yob2JqZWN0KSkpLlRvQXJyYXkoKSkpLCBwYXIpOwoJfQoKCWNsYXNzIFNvbWVDbGFzcwoJewoJCXB1YmxpYyBzdHJpbmcgUHJvcGVydHlPbmUgeyBnZXQ7IHNldDsgfQoJCXB1YmxpYyBzdHJpbmcgUHJvcGVydHlUd28geyBnZXQ7IHNldDsgfQoJCXB1YmxpYyBzdHJpbmcgUHJvcGVydHlUaHJlZSB7IGdldDsgc2V0OyB9CgkJcHVibGljIGludCBQcm9wZXJ0eUZvdXIgeyBnZXQ7IHNldDsgfQoJfQp9