【问题标题】:Casting the Expression.Property result转换 Expression.Property 结果
【发布时间】:2012-08-02 14:24:55
【问题描述】:

动态创建Expression 树时如何创建演员表?

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

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

我想一般地创建一个强类型的 lambda 表达式来表示一个委托,它返回一个 object 而不是 string (Expression<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&lt;Func&lt;Test, string&gt;&gt; 转换为Expression&lt;Func&lt;Test, object&gt;&gt;)。

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

【问题讨论】:

  • 创建 lambda 时,由于您知道类型是什么,因此使用 generic overloads 之一会更干净。尽管如果Id 是值类型,则仍然需要Convert 表达式。

标签: c# reflection expression-trees


【解决方案1】:

使用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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2014-06-23
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多