Meilleure façon d'appeler une méthode d'instance dans les arbres d'expression?

c# expression-trees linq

Question

Quel est le meilleur moyen d'appeler une méthode d'instance dans un arbre d'expression? Ma solution actuelle ressemble à ceci pour une méthode d'interface "objet GetRowValue (rowIndex)" de l'interface IColumn.

public static Expression CreateGetRowValueExpression(
    IColumn column, 
    ParameterExpression rowIndex)
        {
            MethodInfo methodInfo = column.GetType().GetMethod(
                "GetRowValue",
                BindingFlags.Instance | BindingFlags.Public,
                null,
                CallingConventions.Any,
                new[] { typeof(int) },
                null);
            var instance = Expression.Constant(column);
            return Expression.Call(instance, methodInfo, rowIndex);            
        }

Y at-il un moyen plus rapide? Est-il possible de créer l'expression sans avoir à passer le nom de la méthode sous forme de chaîne (mauvais pour le refactoring)?

Réponse acceptée

Vous pouvez le faire avec une méthode d'assistance:

MethodCallExpression GetCallExpression<T>(Expression<Func<T>> e)
{
    return e.Body as MethodCallExpression;
}

/* ... */
var getRowValExpr = GetCallExpression(x => x.GetRowValue(0));



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