Я написал Nitriq, и на первый взгляд я подумал, что ваш запрос должен работать, но после некоторого тестирования я выяснил, почему он не возвращает желаемые значения.
Во-первых, ваш arTypes только возвращает производноеТипы ActionResult
, а не ActionResult
.Таким образом, теоретически ваш запрос будет возвращать методы, только если он вернет JsonResult
, который наследуется от ActionResult
.Я сказал теоретически, потому что коллекция DerivedTypes для объекта Nitriq Type заполняется только в тех сборках, которые вы выбрали для анализа, а не в зависимых сборках (например, System.Web.Mvc).Мы сделали это, чтобы сократить время анализа, потому что большинство людей не заботятся о том, какие методы вызываются их зависимыми сборками, иначе они также будут анализировать зависимые сборки.Однако, ретроспективно, знание производных типов зависимых сборок, вероятно, довольно полезно, и мы, вероятно, изменим его в будущем.
Предполагая, что вы не хотите добавлять System.Web.Mvc в свой проект Nitriq,Вы должны иметь возможность использовать запрос, подобный приведенному ниже, чтобы получить то, что вы хотите.
var stringType = Types.Where(t => t.FullName == "System.String").Single();
var arTypes = Types.Where(t => t.FullName == "System.Web.Mvc.ActionResult" || t.FullName == "System.Web.Mvc.JsonResult");
var results =
from m in Methods
let DerivesFromAR = arTypes.Contains(m.ReturnType)
where m.ParameterTypes.Contains(stringType) && DerivesFromAR
select new { m.MethodId, m.Name, m.FullName };
Если вы действительно хотите добавить System.Web.Mvc, вы можете найти его по адресу
C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.Mvc.dll
В этом случае ваш новый запрос Nitriq должен быть:
var stringType = Types.Where(t => t.FullName == "System.String").Single();
var arTypes = Types.Where(t => t.FullName == "System.Web.Mvc.ActionResult").SelectMany(t => t.DerivedTypes);
var arType = Types.Where(t => t.FullName == "System.Web.Mvc.ActionResult").Single();
var results =
from m in Methods
let DerivesFromAR = arTypes.Contains(m.ReturnType) || m.ReturnType == arType
where m.ParameterTypes.Contains(stringType) && DerivesFromAR
select new { m.MethodId, m.Name, m.FullName };