【问题标题】:Apply MemberExpression to an object to retrieve Property value将 MemberExpression 应用于对象以检索属性值
【发布时间】:2015-12-16 05:44:11
【问题描述】:

我正在尝试编写一个通用函数,它接受一个成员表达式和一个对象,并返回成员表达式中定义的属性的值。

这是获取属性名称的代码示例。

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;
    }
}

但我想从模型中检索属性的值:

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;
    }
}

我调用这个函数的方式是:

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

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    MemberExpression 指的是MemberInfo,如果是属性表达式,则为PropertyInfo

    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);
        }
    }
    

    此外,交换参数更自然(首先是model,其次是表达式)。作为副作用,这允许编译器推断类型参数:

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

    【讨论】:

    • 如何为嵌套成员执行此操作?
    猜你喜欢
    • 2019-05-30
    • 2018-07-26
    • 2013-09-03
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多