表示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。但是,我对引用类型的属性没有意见。
我还不是很熟悉表情树,我做错了什么?
解决方案是使用以下签名:
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;