10

To this day, I have not found a great article about expressions - and how to look at a C# lambda statement and say "oh, that's a blah blah"... so, if you know of a good article, I'd appreciate that as an answer too.

Code sample to explain the question

So... given the following c# code:

public class SomeClass<T>
{
    public TResult SomeMethod<TResult>(Expression<Func<T, TResult>> expression)
    {
        // This is just an example... don't get hung up on this :)
        return default(TResult);
    }
}

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }
}

How do I do this...

var blah = new SomeClass<Person>();

blah.SomeMethod(p => p.FirstName);

at runtime (using reflection)?

What I expect as an answer

I kinda expect something like this... but I'm sure I'm way off with my choice of expressions.

// By the way, these values are being passed to me... so you
// can't change this part of the question :)
Type personType = typeof(Person);
string propertyName = "FirstName";

// THIS CODE BELOW IS OBVIOUSLY WRONG, BUT YOU GET THE IDEA OF
// WHAT I HOPE TO DO... THIS LINE OF CODE BELOW IS **ALL** I'M
// ASKING HOW TO DO :)
var expression = Expression.MakeUnary(ExpressionType.Lambda,
    Expression.Property(Expression.Parameter(personType, "p"),
    propertyName), typeof(string));

blah.SomeMethod(expression);

2 Answers 2

6

Try this:

var functorParam = Expression.Parameter(typeof(Person));
var lambda = Expression.Lambda(
    Expression.Property(functorParam, typeof(Person).GetProperty("FirstName"))
,   functorParam /* <<= EDIT #1 */
);
blah.SomeMethod((Expression<Func<Person,string>>)lambda); /* EDIT #2 */
Sign up to request clarification or add additional context in comments.

4 Comments

blah.SomeMethod(f); does not compile... but I feel that this is very close.
@TimothyKhouri If I understand your intent correctly, SomeMethod should be taking Func<T,TResult> functor rather than Expression<Func<T,TResult>> expression. This way you'd be able to write things like var personsProp = functor(myPerson); and get the last name.
The method that I'm calling into cannot change... it's part of an assembly I'm referencing, and therefor don't have the option to change it... that's why I'm asking this question :)
@TimothyKhouri Remove lambda.Compile and pass the lambda then.
1

ExpressionBuilder is the way to go.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.