Использование Linq для передачи метода - PullRequest
0 голосов
/ 23 августа 2011

Можно ли отправить выражение в метод, получить имя метода и выполнить выражение и вернуть результат?

Идея:

internal T Execute<T>(Expression expr)
{
    // Get method name and the parameters from the expression.
    // Check the methodname+parameters against the db

    // Execute the expression and return T
    return Expression.Execute(expr);
}

Звонок будет выглядеть так:

Expression<Func<string, string, Guid>> myExpression2 = (a, b) => PostMessage(a, b, 1);

return Execute<Guid>(myExpression2);

У вызовов также будут разные типы возврата, в данном случае это guid. Это позволило бы мне проверить метод выражения в методе execute и определить, требуется ли дополнительная регистрация или что-то требует дополнительной аутентификации.

Выражения всегда вызывают метод, такой как PostMessage, GetMessages или подобный.

1 Ответ

2 голосов
/ 23 августа 2011

Да, это возможно.Выражение является разновидностью синтаксического дерева.Вы можете пройтись по нему и извлечь из него необходимую информацию.Если он всегда находится в ожидаемой форме (всегда один вызов метода), вам будет проще.Вам просто нужно найти метод MethodCallExpression http://msdn.microsoft.com/en-us/library/system.linq.expressions.methodcallexpression.aspx

В MSDN есть хороший пример того, как это сделать (ну, они также модифицируют дерево: для вас это будет проще, поскольку вам нужно только прочитатьэто и подтвердите, если я правильно понял) Вот: http://msdn.microsoft.com/en-us/library/bb546136.aspx

...