我正在使用此代码通过反射设置属性的值:
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。但是我对引用类型的属性没有任何问题。
我对表达树不太熟悉,我做错了什么?
答案 0 :(得分:3)
解决方案是使用以下签名:
public static void Set<T, TProp>(this T target, Expression<Func<T, TProp>> memberLamda,
TProp value)
确保正确推断出MemberExpression。 &#34;对象&#34;泛型约束不够具体。
答案 1 :(得分:1)
要注意的是,您的表达式主体很可能会被包装在Convert表达式中,这表示您的属性正在隐式转换为对象。因此,您可能会在Setmethod中需要类似这样的代码。
react-native start --reset-cache