Diffusion du résultat Expression.Property

c# expression-trees reflection

Question

Comment créer un cast lors de la création dynamique d'une arborescence d' Expression ?

Le problème est que j'ai une propriété de type string :

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

Et je veux créer de manière générique une expression lambda fortement typée représentant un délégué qui renvoie un object au lieu d'une string ( Expression<Func<T, object>> ).

En ce moment je fais ceci:

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

Mais il lève une exception dans la dernière ligne (je ne peux pas convertir Expression<Func<Test, string>> en Expression<Func<Test, object>> ).

Comment MemberExpression le corps de l'expression (je présume que la partie MemberExpression doit être jeté dans un object )?

Réponse acceptée

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi