如何使用Reflection或其他准确方法获取控制器内的当前ASP.NET核心控制器方法名称

我想获取我的ASP.NET Core控制器的当前方法名称

我试过通过reflection获取方法名称:

  [HttpGet] public async Task CreateProcess(int catId) { string methodName = System.Reflection.MethodBase.GetCurrentMethod().Name; 

但这给了我一个MoveNext的值,而不是CreateProcess

请注意我不想使用ViewContext

 string methodName = ActionContext.RouteData.Values["action"].ToString(); 

因为我通过启动设置小写我的URL。上面将得到createprocess而不是CreateProcess

我最好想要一个简单的单行而不是多行扩展方法。

您可以使用以下事实:它不仅仅是一个控制器,而是使用ActionContext.ActionDescriptor.Name属性来获取操作名称

更新:(感谢Jim Aho)

最新版本适用于 –

 ControllerContext.ActionDescriptor.ActionName 

在ASP.NET Core中,它似乎已更改,您必须使用ActionName属性

 ((Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor)ViewContext.ActionDescriptor).ActionName; 

C#5.0 CallerMemberName属性可以解决问题。 (我没有从异步方法测试过它;它可以通过常规调用工作)

 private static string GetCallerMemberName([CallerMemberName]string name = "") { return name; } 

然后从你的代码中调用它:

 [HttpGet] public async Task CreateProcess(int catId) { string methodName = GetCallerMemberName(); 

请注意,您无需向方法传递任何内容。

使用StackTrace类和它的GetFrames,直到找到你想要的那个。

您可以通过base.ControllerContext.ActionDescriptor.ActionName获取它

这适用于.NET Core 1.0。