Expression.Body作为MemberExpression为原始属性返回null

时间:2015-06-29 16:53:46

标签: c# linq lambda

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

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。但是我对引用类型的属性没有任何问题。

我对表达树不太熟悉,我做错了什么?

2 个答案:

答案 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