强制转换表达式.属性结果

本文关键字:属性 结果 表达式 转换 | 更新日期: 2024-09-19 08:51:23

动态创建Expression树时,如何创建强制转换?

问题是,我有一个类型为string:的属性

public class Test
{
    public string Id { get; set; }
}

我想一般地创建一个强类型lambda表达式,表示返回object而不是stringExpression<Func<T, object>>)的委托。

现在我正在做这个:

private static Expression<Func<T, object>> CreateIdQuery()
{
    Type type = typeof(T);
    PropertyInfo idProperty = type.GetProperty("Id");
    ParameterExpression lambdaParam = Expression.Parameter(type, "x");
    MemberExpression body = Expression.Property(lambdaParam, idProperty);
    LambdaExpression expr = Expression.Lambda(body, lambdaParam);
    return (Expression<Func<T, object>>)expr;
}

但它在最后一行抛出了一个异常(我不能将Expression<Func<Test, string>>强制转换为Expression<Func<Test, object>>)。

如何转换表达式的主体(我假设MemberExpression部分需要转换为object)?

强制转换表达式.属性结果

使用Expression.Convert(body, typeof(object))

private static Expression<Func<T, object>> CreateIdQuery()
{
    Type type = typeof(T);
    PropertyInfo idProperty = type.GetProperty("Id");
    ParameterExpression lambdaParam = Expression.Parameter(type, "x");
    MemberExpression body = Expression.Property(lambdaParam, idProperty);
    UnaryExpression converted = Expression.Convert(body, typeof(object));
    LambdaExpression expr = Expression.Lambda(converted, lambdaParam);
    return (Expression<Func<T, object>>)expr;
}