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

时间:2017-02-09 13:05:00

标签: c# asp.net asp.net-mvc c#-4.0 c#-3.0

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

// 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#

中获取当前的异步方法名称

1 个答案:

答案 0 :(得分:2)

你想要的是不可能的。编译器为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方法(我不确定,但我猜这个参数在编译时被替换)。