gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:00:31 25 4
gpt4 key购买 nike

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

我如何调用该函数(假设在名为 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 为我提供了调用方法(来自 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))

它还通过重载处理无返回类型签名:

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

最佳答案

如果您修改 SafeSocketCommand接受Expression<Func<TResult>>然后您将可以访问表示 lambda 主体的表达式树,您可以从中访问 ReadCurrentBuffer直接打电话。

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

关于C# (.NET 3.5) 有没有办法得到这个函数名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1842040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com