gpt4 book ai didi

c# - 我们如何在 C# 中获取异步方法名称

转载 作者:行者123 更新时间:2023-12-03 09:11:26 25 4
gpt4 key购买 nike

我想通过使用反射等来获取此方法的名称...我使用了很多东西,但我累了,请帮助我。如果该功能是同步的,那么下面的代码将正常工作。请仔细阅读下面的代码,这将清除我的问题。

// this will work fine
public void Test()
{
// This GetCurrentMethod() will you the name of current method
string CurrentMethodName = GetCurrentMethod();
// output will be CurrentMethodName = Test
}


// this will not work
public async Task<int> GETNumber(long ID)
{
// This GetCurrentMethod() will you the name of current method if the method is sync or not async
string CurrentMethodName = GetCurrentMethod();
return await Task.Run(() => { return 20; });
}

此方法为我提供非异步方法的名称。但我如何获得上面的方法名称

>     [MethodImpl(MethodImplOptions.NoInlining)]
> public static string GetCurrentMethod()
> {
> var stackTrace = new StackTrace();
> StackFrame stackFrame = stackTrace.GetFrame(1);
> return stackFrame.GetMethod().Name;
> }

但此方法仅适用于非异步方法。那么如何在c#中获取当前的异步方法名称

最佳答案

你想要的实际上是不可能的。编译器为 async 方法创建一个状态机,类似的东西

public class GetNumberStateMachine : IAsyncStateMachine
{
// ....
void IAsyncStateMachine.MoveNext()
{
// here your actual code happens in steps between the
// await calls
}
}

并将您的方法转换为类似的内容:

public async Task<int> GetNumber()
{
GetNumberStateMachin stateMachine = new GetNumberStatemachine();
stateMachine.\u003C\u003Et__builder = AsyncTaskMethodBuilder<int>.Create();
stateMachine.\u003C\u003E1__state = -1;
stateMachine.\u003C\u003Et__builder.Start<GetNumberStatemachine>(ref stateMachine);
return stateMachine.\u003C\u003Et__builder.Task;
}

因此,在运行时调用 GetCurrentMethod() 的不再是 GetNumber()


但是可以通过 CallerMemberNameAttribute 获取调用方法的名称:

public static string GetCurrentMethod([CallingMemberName] string method = "")
{
return method;
}

public async Task<int> GetNumber(long ID)
{
int result = await Task.Run(() => { return 20; });
Console.WriteLine(GetCurrentMethod()); // prints GetNumber
return result;
}

这甚至适用于async方法(我不确定,但我猜参数在编译时被替换)。

关于c# - 我们如何在 C# 中获取异步方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42137537/

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