8

コントローラーでアクション メソッドを見つけようとする (URL ルーティングを支援するための) コードがいくつかあります。

私のコントローラーは次のようになります:

public ActionResult Item(int id)
{
    MyViewModel model = new MyViewModel(id);
    return View(model);
}

[HttpPost]
public ActionResult Item(MyViewModel model)
{
    //do other stuff here
    return View(model);
}

次のコードは、url アクションに一致するメソッドを見つけようとします。

//cont is a System.Type object representing the controller
MethodInfo actionMethod = cont.GetMethod(action);

今日、このコードはSystem.Reflection.AmbiguousMatchException: Ambiguous match found、2 つのメソッドが同じ名前であることを考えると理にかなった a をスローしました。

Typeオブジェクトの使用可能なメソッドを調べたところpublic MethodInfo[] GetMethods();、特定の名前のメソッドを検索するためのオーバーロードがないように見えることを除いて、私が望むことをしているように見えることがわかりました。

このメソッドを使用して、返されるすべてを検索することもできますが、複数ある場合に、特定の名前を持つクラス内のすべてのメソッドのリストを取得する別の (より簡単な) 方法があるかどうか疑問に思っています。

4

3 に答える 3

4

reallyの結果を検索することに問題はありませんGetMethodsが、本当にしたい場合は、次のようにすることができます。

var flags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;

var myOverloads = typeof(MyClass)
                  .GetMember("OverloadedMethodName", MemberTypes.Method, flags)
                  .Cast<MethodInfo>();

...このメソッドを使用します。必要に応じてバインディング フラグを変更する必要がある場合があります。

reference-source を確認したところ、これは内部的に member-name をキーとする cached-multimap に依存していることがわかりました (RuntimeType.GetMemberList を参照)。そのため、毎回クライアント コードを検索するよりも効率的です。

また、次のこともできます (少なくとも理論的には、より便利ですが、効率はわずかに低下します)。

var myOverloads = typeof(MyClass).GetMember("OverloadedMethodName")
                                 .OfType<MethodInfo>();
于 2013-05-29T13:38:42.770 に答える
1

使用する

cont.GetMethod(action, new [] {typeof(MyViewModel )})
于 2013-05-29T13:32:57.093 に答える