Casting el resultado de Expression.Property

c# expression-trees reflection

Pregunta

¿Cómo creo una conversión al crear un árbol de Expression dinámicamente?

El problema es que tengo una propiedad de tipo string :

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

Y quiero crear genéricamente una expresión lambda de tipo fuerte que represente a un delegado que devuelva un object lugar de una string ( Expression<Func<T, object>> ).

Ahora mismo estoy haciendo esto:

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;
}

Pero lanza una excepción en la última línea (no puedo convertir Expression<Func<Test, string>> a Expression<Func<Test, object>> ).

¿Cómo MemberExpression el cuerpo de la expresión (supongo que la parte MemberExpression debe convertir en un object )?

Respuesta aceptada

Utilice 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;
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué