2017-06-09 13 views
8

dotnet coreの属性を持つすべてのコントローラとアクションを見つける方法は?すべてのコントローラとアクションを見つける方法

public static List<string> GetControllerNames() 
{ 
    List<string> controllerNames = new List<string>(); 
    GetSubClasses<Controller>().ForEach(type => controllerNames.Add(type.Name.Replace("Controller", ""))); 
    return controllerNames; 
} 
public static List<string> ActionNames(string controllerName) 
{ 
    var types = 
     from a in AppDomain.CurrentDomain.GetAssemblies() 
     from t in a.GetTypes() 
     where typeof(IController).IsAssignableFrom(t) && 
      string.Equals(controllerName + "Controller", t.Name, StringComparison.OrdinalIgnoreCase) 
    select t; 

    var controllerType = types.FirstOrDefault(); 

    if (controllerType == null) 
    { 
     return Enumerable.Empty<string>().ToList(); 
    } 
    return new ReflectedControllerDescriptor(controllerType) 
     .GetCanonicalActions().Select(x => x.ActionName).ToList(); 
} 

が、そのはDOTNETコアで動作していない:.NET Frameworkの 私はこのコードを使用していました。

+0

https://stackoverflow.com/questions/38308713/how-to-find-namespace-of-class-by-its-name-using-reflection-in-net-core –

答えて

6

これらのことを知る必要があるコンポーネントにIActionDescriptorCollectionProviderを注入するのはどうですか? Microsoft.AspNetCore.Mvc.Infrastructure名前空間にあります。

このコンポーネントは、アプリで利用可能なすべてのアクションを提供します。ここではそれが提供するデータの例である:ボーナスとして

Action descriptor collection provider data sample

、あなたはまた、すべてのフィルタを評価することができ、パラメータなどのサイドノートとして


、私はあなたを想定します反射を使用してControllerBaseから継承する型を見つけることができます。しかし、あなたがそれを継承しないコントローラを持つことができるのを知っていましたか?そして、あなたはこれらの規則を覆す慣習を書くことができますか?このため、上記の部品を注入する方がずっと簡単です。あなたはそれを壊すことを心配する必要はありません。

+0

ご協力いただきありがとうございます。このhttps://stackoverflow.com/questions/39276763/getting-controller-details-in-asp-net-coreおよびhttps://stackoverflow.com/questions/31874733/how-to-read-action-methods-attributes -in-asp-net-core-mvc私はそれを解決するのに役立ちます:) – Raika

関連する問題