Reputation: 587
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
Upvotes: 4
Views: 4875
Reputation: 32192
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);
}
Upvotes: 1
Reputation: 134891
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);
}
Upvotes: 10