Lou*_*Lou 3 c# reflection expression-trees
如何Expression
动态创建树时创建强制转换?
问题是,我有一个类型的属性string
:
public class Test
{
public string Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想一般创建一个强类型的lambda表达式,表示一个委托,它返回一个object
而不是a 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;
}
Run Code Online (Sandbox Code Playgroud)
但它在最后一行引发异常(我无法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;
}
Run Code Online (Sandbox Code Playgroud)