轉換Expression.Property結果

c# expression-trees reflection

如何動態創建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>>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;
}


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因