У меня есть функция, которая завершает вызов одному из моих типов сокетов. Если есть ошибка, я хочу иметь возможность печатать предупреждение и повторять попытку. В предупреждении я хочу иметь имя метода. Однако он был объявлен как лямбда. Возможно ли это?C# (.NET 3.5) Есть ли способ получить это имя функции?
Как вызвать функцию (предположим, что функция называется 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 дает мне метод вызова (из стека Trace?) '< myMain> 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; });
}
Если делегат, который прошел мимо, имеет 20 строк кода в нем, вы просто хотите, чтобы строка «возвращалась»? – CSharpAtl
В моей реализации не было бы 20 строк, но, ради аргументов, скажем, я просто хочу эту строку. – cgyDeveloper