gpt4 book ai didi

c# - 将 MemberExpression 应用于对象以检索属性值

转载 作者:行者123 更新时间:2023-11-30 21:52:57 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

关于c# - 将 MemberExpression 应用于对象以检索属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34304756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com