我希望通过使用反射等来获取此方法的名称...我使用了很多东西但是我很累,请帮助我。 如果函数是同步的,那么它下面的代码将正常工作。请仔细阅读以下代码,这将清除我的问题。
// 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#
中获取当前的异步方法名称答案 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
方法(我不确定,但我猜这个参数在编译时被替换)。