我有一个函数包含对我的一个套接字类型的调用.如果有错误,我希望能够打印警告并重试.在警告中,我想要方法名称.但是,它被宣布为lambda.这甚至可能吗?
我如何调用该函数(假设在函数myMain中):
SafeSocketCommand(() => this.mySocket.ReadCurrentBuffer());
Run Code Online (Sandbox Code Playgroud)
基本包装功能:
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;
}
Run Code Online (Sandbox Code Playgroud)
但socketCommand.Method.Name为我提供了调用方法(来自Stack Trace?)'<myMain> b__3',我希望socketCommand(mySocket.ReadCurrentBuffer)调用实际函数.是否可以在任何地方获取此信息,或者由于在lambda中声明而丢失?
编辑:
我应该提到我使用这个特定的调用约定,以便我可以使用各种签名的基于套接字的命令.
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))
Run Code Online (Sandbox Code Playgroud)
它还通过重载处理没有返回类型的签名:
protected void SafeSocketCommand(Action socketCommand)
{
SafeSocketCommand(() => { socketCommand(); return 0; });
}
Run Code Online (Sandbox Code Playgroud)
如果您修改SafeSocketCommand了接受a,Expression<Func<TResult>>那么您将可以访问表示lambda主体的表达式树,您可以从中ReadCurrentBuffer直接访问该呼叫.
但是,如果你这样做,你将不再处理常规的匿名方法; 要实际调用它,您需要将表达式树编译为代码.您可能还需要灵活处理代码期望在lambda体内出现的内容.
| 归档时间: |
|
| 查看次数: |
576 次 |
| 最近记录: |