如何为参考和值类型创建属性的表达式?

时间:2013-02-05 12:48:41

标签: c# reflection linq-expressions

我正在尝试在运行时创建表达式以传递给第三方API,该API具有签名 Expression<Func<T, object>>。以下是我到目前为止的情况。这适用于引用类型,但值类型会导致异常(第3行)。

  

类型'System.Boolean'的表达式不能用于返回类型   'System.Object的'

我假设这是由于拳击问题,我没有处理。

我尝试添加Expression.TypeAs(property, typeof(object)),但API不会接受/解析此输入,因为它会生成obj=> (obj.Foo As Object)

任何人对如何创建与任何类型的所需签名匹配的表达式有任何想法?

// must be in the form of 'obj => obj.Foo', or the API wont parse
private static Expression<Func<T, object>> CreatePropertyExpression(PropertyInfo propertyInfo)
{
   var instanceParam = Expression.Parameter(propertyInfo.DeclaringType, "obj");
   var property = Expression.Property(instanceParam, propertyInfo);
   var lambda = Expression.Lambda<Func<T, object>>(property, instanceParam); // kaboom

   return (Expression<Func<T, object>>)lambda;
}

1 个答案:

答案 0 :(得分:2)

添加演员/转换:

return Expression.Lambda<Func<T, object>>(
    Expression.Convert(property, typeof(object)), instanceParam);