У меня есть функция:Pass Expression Tree в качестве параметра метода
public void Execute(Expression<Action> expression)
{
var time = expression.Compile().Benchmark();
var msg = string.Format("{0} took {1} to complete",
ReflectionHelper.GetComponentCallDetails().ToString(),
time.ToString(@"hh\:mm\:ss\.ff"));
Logger.Info(msg);
}
Делегат, который должен называться что-то вроде:
channels = GetAllChannelsImpl(maxResults);
Я относительно новым для Expression Trees и не могу понять, способ передачи делегата Action методу.
Я был в состоянии сделать такую же функциональность, используя
public void Execute(Action action)
{
var time = action.Benchmark();
var msg = string.Format("{0} took {1} to complete",
ReflectionHelper.GetComponentCallDetails().ToString(),
time.ToString(@"hh\:mm\:ss\.ff"));
Logger.Info(msg);
}
и призванию
Execute(() =>
{
channels = GetAllChannelsImpl(maxResults);
});
Но я хотел бы использовать подход, основанный Expression Tree для того, чтобы исключить необходимость использования накладных расходов отражения, чтобы выяснить детали метода, вызванного для его регистрации.
Может ли кто-нибудь предложить правильный способ передать дерево выражений для указанного делегата действия в качестве параметра метода.
Вы перегрузили метод 'Execute()', поэтому компилятор предпочитает версию с «Action» в версию с выражением «Expression». Синтаксис вызова может быть таким же, если это не так. Вы пробовали 'new Expression (() => // и т. Д.)'? Это должно быть просто. –
Jonno