How can I make this work with deep properties

Posted by Martin Robins on Stack Overflow See other posts from Stack Overflow or by Martin Robins
Published on 2010-05-16T10:06:04Z Indexed on 2010/05/16 10:10 UTC
Read the original article Hit count: 411

Filed under:
|
|

Given the following code...

class Program {

    static void Main(string[] args) {

        Foo foo = new Foo { Bar = new Bar { Name = "Martin" }, Name = "Martin" };

        DoLambdaStuff(foo, f => f.Name);
        DoLambdaStuff(foo, f => f.Bar.Name);

    }

    static void DoLambdaStuff<TObject, TValue>(TObject obj, Expression<Func<TObject, TValue>> expression) {

        // Set up and test "getter"...

        Func<TObject, TValue> getValue = expression.Compile();

        TValue stuff = getValue(obj);

        // Set up and test "setter"...

        ParameterExpression objectParameterExpression = Expression.Parameter(typeof(TObject)), valueParameterExpression = Expression.Parameter(typeof(TValue));
        Expression<Action<TObject, TValue>> setValueExpression = Expression.Lambda<Action<TObject, TValue>>(
            Expression.Block(
                Expression.Assign(Expression.Property(objectParameterExpression, ((MemberExpression)expression.Body).Member.Name), valueParameterExpression)
            ), objectParameterExpression, valueParameterExpression
        );
        Action<TObject, TValue> setValue = setValueExpression.Compile();


        setValue(obj, stuff);

    }

}

class Foo {

    public Bar Bar { get; set; }
    public string Name { get; set; }

}

class Bar {

    public string Name { get; set; }

}

The call to DoLambdaStuff(foo, f => f.Name) works ok because I am accessing a shallow property, however the call to DoLambdaStuff(foo, f => f.Bar.Name) fails - although the creation of the getValue function works fine, the creation of the setValueExpression fails because I am attempting to access a deep property of the object.

Can anybody please help me to modify this so that I can create the setValueExpression for deep properties as well as shallow?

Thanks.

© Stack Overflow or respective owner

Related posts about .NET

Related posts about lambda