Нет; Я не верю, что это так; если вы хотите, чтобы он кэшировался, вы должны удерживать ссылку Delegate
(обычно Func<...>
или Action<...>
). Аналогично, если вы хотите добиться максимальной производительности, вы должны скомпилировать его как параметризованное выражение, чтобы при вызове вы могли отправлять разные значения.
В этом случае перефразировка поможет:
public MyResultType DoSomething(int arg1, int arg2)
{
var result = invokeHandler(
(IDoSomethingHandler h, int a1, int a2) => h.DoSomething(a1, a2),
arg1, arg2);
return result;
}
private TResult invokeHandler<T, TResult>(Expression<Func<T,int,int,TResult>> action,
int arg1, int arg2)
where T : class
{
// Here, I might want to check to see if action is already cached.
var compiledAction = action.Compile();
var methodCallExpr = action as MethodCallExpression;
// Here, I might want to store methodCallExpr in a cache somewhere.
var handler = ServiceLocator.Current.GetInstance<T>();
var result = compiledAction(handler, arg1, arg2);
return result;
}
т.е. сделать числовые параметры выражения и передать их фактическим во время выполнения (а не быть константами в выражении).