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