2012-08-02 53 views
3

如何动态创建Expression树时创建投射?投射Expression.Property结果

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

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

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

现在我这样做:

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)?

+0

在创建拉姆达,因为你知道这个类型是什么,这将是清洁使用[通用重载]之一(http://msdn.microsoft.com/en-us/library/system .linq.expressions.expression.lambda.aspx)。虽然如果'Id'是一个值类型,'Convert'表达式仍然会被需要。 – 2012-08-03 15:44:00

回答

6

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

这就是我一直在寻找的,谢谢! – Lou 2012-08-03 08:33:50