Création d'un arbre d'expression pour accéder à la propriété d'un type générique

c# expression-trees generics linq

Question

J'ai besoin d'écrire une méthode générique qui prend l'instance du type générique et le nom de la propriété au format chaîne et renvoie un arbre d'expression.

J'ai besoin de convertir une simple expression lambda

a => a.SomePropertyName

a est un type générique qui aura une propriété sous le nom SomePropertyName

Je sais que nous pouvons obtenir les informations de propriété en utilisant le code de réflexion suivant

System.Reflection.PropertyInfo propInfo = a.GetType().GetProperty("SomePropertyName");

Cela peut sembler très simple, mais je ne connais pas bien les arbres d’expression. Si vous avez une question similaire, veuillez la relier et la fermer.

Réponse acceptée

En supposant que le type de paramètre et le type de retour ne soient pas connus à l'avance, vous devrez peut-être utiliser un object , mais fondamentalement, il s'agit simplement de:

var p = Expression.Parameter(typeof(object));
var expr = Expression.Lambda<Func<object, object>>(
    Expression.Convert(
        Expression.PropertyOrField(
             Expression.Convert(p, a.GetType()), propName), typeof(object)), p);

Si les types d'entrée et de sortie sont connus, vous pouvez modifier les paramètres Func<,> et éventuellement supprimer Expression.Convert . À l'extrême, vous pouvez obtenir un lambda sans connaître la signature de lambda , via:

var p = Expression.Parameter(a.GetType());
var expr = Expression.Lambda(Expression.PropertyOrField(p, propName), p);

Réponse populaire

Vous pouvez utiliser ceci:

var p = Expression.Parameter(a.GetType(), "x");
var body = Expression.Property(p, "SomePropertyName");

Expression.Lambda(body, p);


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