Il modo migliore per chiamare un metodo di istanza in Expression Trees?

c# expression-trees linq

Domanda

Qual è il modo migliore per chiamare un metodo di istanza all'interno di un albero delle espressioni? La mia attuale soluzione è qualcosa del genere per un metodo di interfaccia "oggetto GetRowValue (rowIndex)" dell'interfaccia 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);            
        }

C'è un modo più veloce? È possibile creare l'espressione senza dover passare il nome del metodo come stringa (non valido per il refactoring)?

Risposta accettata

Puoi farlo con un metodo di supporto:

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

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché