Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#(.NET3.5)有没有办法获取此函数名?_C#_.net_Lambda - Fatal编程技术网

C#(.NET3.5)有没有办法获取此函数名?

C#(.NET3.5)有没有办法获取此函数名?,c#,.net,lambda,C#,.net,Lambda,我有一个函数,它包装对我的一种套接字类型的调用。如果出现错误,我希望能够打印警告并重试。在警告中,我想要方法名。然而,它被宣布为lambda。这可能吗 如何调用函数(在名为myMain的函数中假设): 基本包装功能: protected TResult SafeSocketCommand<TResult>(Func<TResult> socketCommand) { TResult retValue = default(TResult); try

我有一个函数,它包装对我的一种套接字类型的调用。如果出现错误,我希望能够打印警告并重试。在警告中,我想要方法名。然而,它被宣布为lambda。这可能吗

如何调用函数(在名为myMain的函数中假设):

基本包装功能:

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;
}
它还通过重载处理无返回类型签名:

protected void SafeSocketCommand(Action socketCommand)
{
    SafeSocketCommand(() => { socketCommand(); return 0; });
}

不,因为lambda没有名字;它们是匿名函数。您可以从最后一个stackframe获取方法名称,但是:

new StackFrame(1).GetMethod().Name;

不,因为lambda没有名字;它们是匿名函数。您可以从最后一个stackframe获取方法名称,但是:

new StackFrame(1).GetMethod().Name;
他只是一名代表。不要使用lambda,而是创建一个与
Func
的签名匹配的方法并调用它。这样,你就可以得到你想要的任何名字

SafeSocketCommand(MyNewMethod);

他只是一名代表。不要使用lambda,而是创建一个与
Func
的签名匹配的方法并调用它。这样,你就可以得到你想要的任何名字

SafeSocketCommand(MyNewMethod);


如果修改
SafeSocketCommand
以接受
表达式
,则可以访问表示lambda主体的表达式树,从中可以直接访问
ReadCurrentBuffer
调用


但是,如果您这样做,您就不再处理常规匿名方法;要真正调用它,需要将表达式树编译为代码。您可能还需要灵活处理代码希望在lambda主体中显示的内容。

如果您修改
SafeSocketCommand
以接受
表达式,则可以访问表示lambda主体的表达式树,您可以从中直接访问
ReadCurrentBuffer
调用


但是,如果您这样做,您就不再处理常规匿名方法;要真正调用它,需要将表达式树编译为代码。对于代码希望在lambda主体中出现的内容,您可能还需要灵活处理。

在这种情况下,您只需执行此调用即可。生成的代码也会更快更小

SafeSocketCommand(mySocket.ReadCurrentBuffer);

通常,Exception对象的属性包含您要查找的完整信息,比打印方法名更准确,或者您可以使用属性作为引发异常的方法的名称。

在这种情况下,您只需此调用即可。生成的代码也会更快更小

SafeSocketCommand(mySocket.ReadCurrentBuffer);

通常,异常对象的属性包含您要查找的完整信息,比打印方法名称更准确,或者您可以使用属性作为引发异常的方法的名称。

如果传入的委托中有20行代码,您是否只需要
返回的行
?在我的实现中不会有20行,但为了参数起见,让我们假设我只需要那一行。如果传入的委托中有20行代码,您是否只需要
返回的行
?在我的实现中不会有20行,但是为了论证起见,假设我只想要那一行,那么在堆栈帧中会出现异常吗?如果它被抓到、重新打包并再次抛出呢?你在考虑堆栈跟踪。这段代码只是检查一个单独的帧。这是一种不使用<>b_uuu3来获取方法名的好方法,但是如果我想要函数名,我可能必须尝试使用表达式并解析树。但是,此时StackFrame中是否会出现异常?如果它被抓到、重新打包并再次抛出呢?你在考虑堆栈跟踪。这段代码只检查一个单独的帧。这是一种不使用<>b_uuu3来获取方法名的好方法,但是如果我想要函数名,我可能必须尝试使用表达式并解析树。有趣的是,我不知道表达式。由于这不再是一个常规的匿名方法,它会不会导致我的各种调用约定失败(无论函数签名如何,我都可以调用)?LINQ本身是建立在这些表达式树上的,所以我在你的问题中没有看到基于调用约定的任何问题。那么,我必须试一试。由于lambda的格式始终是两种样式之一(取决于是否添加了;return 0;),因此解析函数名的树应该很容易。有趣的是,我不知道表达式。由于这不再是一个常规的匿名方法,它会不会导致我的各种调用约定失败(无论函数签名如何,我都可以调用)?LINQ本身是建立在这些表达式树上的,所以我在你的问题中没有看到基于调用约定的任何问题。那么,我必须试一试。由于lambda的格式始终是两种样式之一(取决于是否添加了;return 0;),因此解析函数名树应该很容易。