2017-02-09 1 views
0

私は、リフレクションを使用して私のソリューションの任意のコントローラからActionResultを返すすべてのパブリックメソッドのリストを取得しようとしていますが、奇妙な動作が発生しています。解決策の中でコントローラを反復する

Assembly asm = Assembly.GetAssembly(typeof(MyDLL.MvcApplication)); 

var controllerActionList = asm.GetTypes().ToList(); 

上記のコードを実行すると、すべてのモデルとコントローラなど、すべてのタイプのリストが表示されます。しかし、私がそれを修正し、以下のコードを実行すると、私の結果リストは空に戻ります。ここで何が起こっているか考えてみましょうか?私はこれがすべてのコントローラのリストを取得するので、タイプをフィルタリングする必要がありますと思うだろうか?

Assembly asm = Assembly.GetAssembly(typeof(MyDLL.MvcApplication)); 

var controllerActionList = asm.GetTypes() 
    .Where(type => typeof(Controller).IsAssignableFrom(type)).ToList(); 
+0

あなたのコードを返し、コントローラ内のすべてのパブリックメソッドのペアのリストを提供します。 typeof(Controller)の代わりに、typeof(System.Web.Mvc.Controller)を試すことができますか?次に、System.Web.Mvc.Controllerのサブクラスは本当に報告されるべきです。 –

+0

ええ、私はすでにそれを試して、それは動作しませんでしたが、私はそれが奇妙な方法で動作した。私は、このプロジェクトが使用している.netバージョンは、ターゲットdllが使用しているものとまったく同じではなく、型の比較が常に失敗する原因になっていると思います。下の私の答えをチェックして、私が何をしたいのかを調べてください。助けてくれてありがとう! –

答えて

0

以下のコードを使用して作業しました。私はこれらの2つのプロジェクトの間に2つの異なる.netバージョンがあると信じているため、直接タイプの比較は失敗していると思います。

Assembly asm = Assembly.GetAssembly(typeof(SCCView.MvcApplication)); 

var controllerActionList = asm.GetTypes() 
    .Where(type => type.BaseType.Name == "Controller") 
    .SelectMany(type => type.GetMethods()) 
    .Where(
     m => m.IsPublic && m.ReturnType.Name == "ActionResult") 
    .Select(x => new {Controller = x.DeclaringType.Name, Action = x.Name}) 
    .OrderBy(x => x.Controller).ThenBy(x => x.Action).ToList(); 

上記はあなたに本当に動作するはずのActionResult

関連する問題