表示Body as MemberExpression为基元属性返回null

本文关键字:属性 返回 null Body as MemberExpression 表示 | 更新日期: 2023-09-27 18:00:18

我使用此代码通过反射设置属性的值:

public static void Set<T>(this T target, Expression<Func<T, object>> memberLamda, object value)
{
    var memberSelectorExpression = memberLamda.Body as MemberExpression;
    if (memberSelectorExpression != null)
    {
        var property = memberSelectorExpression.Member as PropertyInfo;
        if (property != null)
        {
            property.SetValue(target, value, null);
        }
    }
}

但出于某种原因,当我这样做时:

myObject.Set(x=>x.ID, 1);

在ID为int类型的情况下,我可以看到memberSelectorExpression为null。但是,我对引用类型的属性没有意见。

我还不是很熟悉表情树,我做错了什么?

表示Body as MemberExpression为基元属性返回null

解决方案是使用以下签名:

public static void Set<T, TProp>(this T target, Expression<Func<T, TProp>> memberLamda, 
  TProp value)

以确保正确推断MemberExpression。"对象"通用约束不够具体。

需要注意的是,您的表达式主体很可能被封装在Convert表达式中,表示您的属性被隐式转换为对象。因此,您可能需要在Setmethod中使用类似的代码。

var expressionBody = memberLamda.Body;
if (expressionBody is UnaryExpression expression && expression.NodeType == ExpressionType.Convert)
{
    expressionBody = expression.Operand;
}
var memberSelectorExpression = (MemberExpression)expressionBody;