C#(.NET 3.5)有没有办法获得这个函数名?

cgy*_*per 1 .net c# lambda

我有一个函数包含对我的一个套接字类型的调用.如果有错误,我希望能够打印警告并重试.在警告中,我想要方法名称.但是,它被宣布为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)

Tim*_*son 5

如果您修改SafeSocketCommand了接受a,Expression<Func<TResult>>那么您将可以访问表示lambda主体的表达式树,您可以从中ReadCurrentBuffer直接访问该呼叫.

但是,如果你这样做,你将不再处理常规的匿名方法; 要实际调用它,您需要将表达式树编译为代码.您可能还需要灵活处理代码期望在lambda体内出现的内容.