我正在尝试在运行时创建表达式以传递给第三方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;
}
答案 0 :(得分:2)
添加演员/转换:
return Expression.Lambda<Func<T, object>>(
Expression.Convert(property, typeof(object)), instanceParam);