Search code examples
c#.netlambdaexpression-trees

Reading Properties of an Object with Expression Trees


I want to create a Lambda Expression for every Property of an Object that reads the value dynamically.

What I have so far:

var properties = typeof (TType).GetProperties().Where(p => p.CanRead);

foreach (var propertyInfo in properties)
{
    var getterMethodInfo = propertyInfo.GetGetMethod();

    var entity = Expression.Parameter(typeof (TType));

    var getterCall = Expression.Call(entity, getterMethodInfo);

    var lambda = Expression.Lambda(getterCall, entity);
    var expression = (Expression<Func<TType, "TypeOfProperty">>) lambda;
    var functionThatGetsValue = expression.Compile();
}

The code Works well when i call functionThatGetsValue as long as "TypeOfProperty" is hardcoded. I know that I can't pass the "TypeOfPoperty" dynamically. What can I do to achive my goal?


Solution

  • Assuming that you're happy with a Func<TType, object> delegate (as per the comments above), you can use Expression.Convert to achieve that:

    var properties = typeof(TType).GetProperties().Where(p => p.CanRead);
    
    foreach (var propertyInfo in properties)
    {
        MethodInfo getterMethodInfo = propertyInfo.GetGetMethod();
        ParameterExpression entity = Expression.Parameter(typeof(TType));
        MethodCallExpression getterCall = Expression.Call(entity, getterMethodInfo);
    
        UnaryExpression castToObject = Expression.Convert(getterCall, typeof(object));
        LambdaExpression lambda = Expression.Lambda(castToObject, entity);
    
        var functionThatGetsValue = (Func<TType, object>)lambda.Compile();
    }