2016-02-21 3 views
6

私は反射によってメソッド名を取得しようとしている反射または別の正確な方法を使用して、コントローラ内部の現在のASP.NETコアコントローラのメソッド名を取得する方法を

ASP.NET Coreコントローラの現在のメソッド名を取得したいです:

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

が、これは私がViewContext

を使用したくない MoveNextなく CreateProcess

をメモの値を与えます210

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

私は上記のスタートアップsettings.Theを経由して、私のURLを小文字としては私にcreateprocess代わりのCreateProcess

を取得します私は、好ましくは、簡単なワンライナーではなく、複数行の拡張メソッドをしたいです。

答えて

9

あなたはそれだけで任意の方法が、コントローラではないという事実を使用して、アクション名に

UPDATE取得するActionContext.ActionDescriptor.Nameプロパティを使用することができます(ジム・アホのおかげで)

最近のバージョンでは、と連携 -

ControllerContext.ActionDescriptor.ActionName 
+0

これは実際には機能しません。 –

+0

@JimAhoあなたが使用しているASPのどのバージョンですか? –

+0

ASP.NET Core 1.0 –

0

StackTraceクラスを使用して、目的のものが見つかるまでGetFramesを適用します。

2

C#5.0 CallerMemberName属性がこのトリックを行う可能性があります。 (私は非同期メソッドからこれをテストしていない。それは、通常の呼び出しから作品)

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

次に、あなたのコードから呼び出す:あなたが渡す必要はありません

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

注意方法に何か。

4

は、ASP.NETコアでは変更されているようだと、あなたはあなたがbase.ControllerContext.ActionDescriptor.ActionName

これは、.NETのコア1.0で動作することにより、それを得ることができるActionNameプロパティに

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

を使用する必要があります。

関連する問題