Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamic property selector lambda function

I'm trying to build the property selector expression with the type and property name given. i.e. t => t.PropertyName.

The following code compiles just fine but results in empty value. Can someone please point to an error in the code?

    public static Expression<Func<T,object>> CreatePropSelectorExpression(string propName) where T:class,new()
    {
    var temp = Activator.CreateInstance<T>();
    ParameterExpression t = Expression.Parameter(typeof(T),"t");
    MemberExpression member = Expression.PropertyOrField(Expression.Constant(temp),propName);
    return Expression.Lambda<Func<T,object>>(member,t);
    }

Thanks in advance

like image 652
user759141 Avatar asked Dec 21 '22 12:12

user759141


2 Answers

You don't actually need to create an instance of your object T, you're just creating some expression trees. It all boils down to this really:

Expression<Func<T, object>> CreatePropSelectorExpression<T>(string propertyName)
{
    var parameter = Expression.Parameter(typeof(T));
    var body = Expression.Convert(Expression.PropertyOrField(parameter, propertyName), typeof(object));
    return Expression.Lambda<Func<T, object>>(body, parameter);
}
like image 109
Jeff Mercado Avatar answered Dec 24 '22 00:12

Jeff Mercado


A nested version

static Expression<Func<R, O>> 
CreatePropSelectorExpression<R,O>(IEnumerable<string> propertyName)
{
    ParameterExpression parameter = Expression.Parameter(typeof(R));
    Expression selector = propertyName
         .Aggregate((Expression)parameter, 
               (a, name) => Expression.PropertyOrField(a, name));
    return Expression.Lambda<Func<R,O>>(selector, parameter);
}
like image 37
bradgonesurfing Avatar answered Dec 24 '22 01:12

bradgonesurfing