简体   繁体   中英

Apply MemberExpression to an object to retrieve Property value

I am trying to write a generic function that takes a MemberExpression and an object and returns the value of the Property defined in the member expression.

Here's an example of the code to get the Property name.

public static TProperty GetPropertyName<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression, TModel model)
{
    if (expression.Body is MemberExpression)
    {
        return ((MemberExpression)expression.Body).Member.Name;
    }
    else
    {
        var op = ((UnaryExpression)expression.Body).Operand;
        return ((MemberExpression)op).Member.Name;
    }
}

But I want to retrieve the value of the property from the model:

public static string GetPropertyValue<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression, TModel model)
{
    if (expression.Body is MemberExpression)
    {
        // how do I apply the expression.Body to get the value of the property from model??

    }
    else
    {
        var op = ((UnaryExpression)expression.Body).Operand;
        return ((MemberExpression)op).Member.Name;
    }
}

The way I call this function is:

GetPropertyValue<ObjectModel,bool>(m => m.somebool, m);

MemberExpression refers to MemberInfo , which will be PropertyInfo in case of property expression:

static class MemberExpressionHelper
{
    public static TProperty GetPropertyValue<TModel, TProperty>(TModel model, Expression<Func<TModel, TProperty>> expression)
    {
        // case with `UnaryExpression` is omitted for simplicity
        var memberExpression = (MemberExpression)expression.Body;

        var propertyInfo = (PropertyInfo)memberExpression.Member;
        return (TProperty)propertyInfo.GetValue(model);
    }
}

Besides, it is more natural to swap parameters (first is model , second is expression). As a side effect, this allows compiler to infer type arguments:

var bar = MemberExpressionHelper.GetPropertyValue(foo, _ => _.Bar);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM