Come posso creare un cast durante la creazione dinamica di un albero di Expression
?
Il problema è che ho una proprietà di tipo string
:
public class Test
{
public string Id { get; set; }
}
E voglio generare genericamente un'espressione lambda fortemente tipizzata che rappresenta un delegato che restituisce un object
invece di una string
( Expression<Func<T, object>>
).
In questo momento sto facendo questo:
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;
}
Ma lancia un'eccezione nell'ultima riga (non posso lanciare Expression<Func<Test, string>>
in Expression<Func<Test, object>>
).
Come lancio il corpo dell'espressione ( MemberExpression
parte MemberExpression
debba essere inserita in un object
)?
Usa 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;
}