У меня есть функция, которая переносит вызов к одному из моих типов сокетов. Если есть ошибка, я хочу вывести предупреждение и повторить попытку. В предупреждении я хочу указать имя метода. Тем не менее, он был объявлен как лямбда. Это вообще возможно?
Как я вызываю функцию (предположим, что функция называется myMain):
SafeSocketCommand(() => this.mySocket.ReadCurrentBuffer());
Базовая функция упаковки:
protected TResult SafeSocketCommand<TResult>(Func<TResult> socketCommand)
{
TResult retValue = default(TResult);
try
{
retValue = socketCommand();
}
catch (PacketLost)
{
ReportToLogs("Timeout on command '" + socketCommand.Method.Name);
}
return retValue;
}
Но socketCommand.Method.Name дает мне вызывающий метод (из трассировки стека?) ' b__3', и я хочу, чтобы фактическая функция вызывалась socketCommand (mySocket.ReadCurrentBuffer). Можно ли получить эту информацию где-нибудь или она потеряна из-за объявления в лямбде?
EDIT:
Я должен был упомянуть, что я использую это конкретное соглашение о вызовах, чтобы я мог использовать команды на основе сокетов различных сигнатур.
int i = SafeSocketCommand(() => this.mySocket.FunctionReturnsInt())
bool b = SafeSocketCommand(() => this.mySocket.FunctionReturnsBool(string s))
object o = SafeSocketCommand(() => this.mySocket.Complicated(string s, int i, bool b))
Он также не обрабатывает сигнатуры возвращаемого типа при перегрузке:
protected void SafeSocketCommand(Action socketCommand)
{
SafeSocketCommand(() => { socketCommand(); return 0; });
}