Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I build this c# "Expression" at runtime using reflection?

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);
like image 895
Timothy Khouri Avatar asked Dec 16 '11 20:12

Timothy Khouri


2 Answers

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 */
like image 129
Sergey Kalinichenko Avatar answered Sep 29 '22 21:09

Sergey Kalinichenko


ExpressionBuilder is the way to go.

like image 32
Jahan Zinedine Avatar answered Sep 29 '22 22:09

Jahan Zinedine