1

文字列型のコントローラー名からアクション名の選択リストを返す関数は次のとおりです。

public ActionResult get_all_action(string controllername)
        {
            Type t = Type.GetType(controllername);
            MethodInfo[] mi = t.GetMethods();

            List<SelectListItem> action = new List<SelectListItem>();

            foreach (MethodInfo m in mi)
            {
                if (m.IsPublic)
                    if (typeof(ActionResult).IsAssignableFrom(m.ReturnParameter.ParameterType))
                    {
                        action.Add(new SelectListItem() { Value = m.Name, Text = m.Name });
                    }
            }

            var List = new SelectList(action, "Value", "Text");

            return Json(List, JsonRequestBehavior.AllowGet);
        }

get_all_action()のパラメーターcontrollernameは、たとえば「AccountController」として渡されます。しかし、例外はでスローされます

MethodInfo[] mi = t.GetMethods();

なので:

Object reference not set to an instance of an object.
4

3 に答える 3

5

"AccountController"完全な型名ではありません。それを見つけるに"YourApp.Whatever.AccountController"は for のようなものである必要があります。GetType()また、それがどのアセンブリにあるかを明示することも価値があります。たとえば、次のようになります。

var thisType = GetType();
Type t = thisType.Assembly.GetType(
    thisType.Namespace + "." + controllerName);

(同じアセンブリ/名前空間を意味すると仮定します)

于 2012-12-11T08:21:25.557 に答える
1

指定された名前のクラスが見つからないため、明らかにをType.GetType返します。名前空間でフルネームを指定する必要があります。また、コントローラクラスがアセンブリの実行からのものでない場合は、修飾されたアセンブリ名を使用する必要があります(nullAccountController

TopNamespace.SubNameSpace.AccountController, MyAssembly

)。

于 2012-12-11T08:19:01.920 に答える
1

アセンブリ修飾名を指定する必要がありますType.GetType(controllername)

于 2012-12-11T08:22:57.963 に答える