0

コントローラ名からすべてのアクションを取得するための次のコードを見つけました。

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.
4

1 に答える 1

2

メソッドget_all_actionは入力パラメーターとしてTypeを受け取ることを期待していますが、入力パラメーターとしてString(つまりType名)を使用して呼び出しようとしています。

ここの行:

string actionname = get_all_action(val.Name);

代わりに次のようにする必要があります。

string actionname = get_all_action(val);

また、メソッドの最初の数行を次のget_all_actionように変更する必要があります。

public string get_all_action(Type controllerType)
{
    string methods = "";
    MethodInfo[] mi = controllerType.GetMethods();
于 2012-12-09T12:13:24.727 に答える