コントローラのすべてのアクションのリストを取得するにはどうすればよいですか?検索しましたが、例/回答が見つかりません。リフレクションの使用を推奨する例がいくつかありますが、その方法がわかりません。
これが私がやろうとしていることです:
public List<string> ActionNames(string controllerName){
}
コントローラのすべてのアクションのリストを取得するにはどうすればよいですか?検索しましたが、例/回答が見つかりません。リフレクションの使用を推奨する例がいくつかありますが、その方法がわかりません。
これが私がやろうとしていることです:
public List<string> ActionNames(string controllerName){
}
なぜこれが必要なのかは教えてくれませんが、1つの可能性はリフレクションを使用することです。
public 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();
}
明らかに、リフレクションはそれほど高速ではないため、このメソッドを頻繁に呼び出す場合は、コントローラーのリストをキャッシュして毎回フェッチしないようにし、特定の入力パラメーターのメソッドをメモ化することで、リフレクションを改善することを検討してください。
ダリンの答えを少し微調整します。別のアセンブリで実行されるコードレンズでこれを機能させるには、この変更が必要でした。
public static List<string> GetAllActionNames(string controllerName)
{
var controllerType = Assembly.Load("YourAssemblyNameHere")
.GetTypes()
.FirstOrDefault(x => typeof(IController).IsAssignableFrom(x)
&& x.Name.Equals(controllerName + "Controller", StringComparison.OrdinalIgnoreCase));
if (controllerType == null)
{
return Enumerable.Empty<string>().ToList();
}
return new ReflectedControllerDescriptor(controllerType)
.GetCanonicalActions().Select(x => x.ActionName)
.ToList();
}