コントローラ名からすべてのアクションを取得するための次のコードを見つけました。
Type t = typeof(YourControllerType);
MethodInfo[] mi = t.GetMethods();
foreach (MethodInfo m in mi)
{
if (m.IsPublic)
if (typeof(ActionResult).IsAssignableFrom(m.ReturnParameter.ParameterType))
methods = m.Name + Environment.NewLine + methods;
}
次のようにコントローラー名を渡すことで、次のコードを関数として動的にします。
public string get_all_action(type ob)
{
string methods = "";
Type t = typeof(ob);
MethodInfo[] mi = t.GetMethods();
foreach (MethodInfo m in mi)
{
if (m.IsPublic)
if (typeof(ActionResult).IsAssignableFrom(m.ReturnParameter.ParameterType))
methods = m.Name + Environment.NewLine + methods;
}
return methods;
}
しかし、定義時および関数の呼び出し中に、どのタイプのパラメーターを関数に渡す必要があるのか混乱しています。すべてのコントローラーを取得し、コントローラー名をget_all_action()に渡すための次のコードがあります。
var asm = Assembly.GetExecutingAssembly();
var controllerTypes = from d in asm.GetExportedTypes() where typeof(IController).IsAssignableFrom(d) select d;
foreach(var val in controllerTypes)
{
string actionname = get_all_action(val.Name);
}
ここで、val.Nameは文字列型であるため、例外がスローされます。
Object reference not set to an instance of an object.