Возможно ли сегодня с помощью nDepend и CQL запрашивать классы напрямую, используя классы производного типа? - PullRequest
2 голосов
/ 21 апреля 2011

Прочитал много вопросов и сообщений и увидел, что подзапросы / вложенные запросы / составление запросов не будут поддерживаться до следующей версии. Однако я не уверен, что это то, что мне нужно, в голове я бы написал так, но я мог бы усложнить ситуацию.

Я представляю это как

WARN IF Count > 0 IN
SELECT TYPES WHERE
      IsDirectlyUsing "MTNE.Web.OneWeb.^.*\p{Proxy}+$" IN
      SELECT TYPES WHERE DeriveFrom "System.Web.Services.Protocols.SoapHttpClientProtocol"

Итак, я хотел бы проверить, используют ли типы непосредственно другие типы в данном пространстве имен с суффиксом Proxy и что тип прокси получен из SoapHttpClientProtocol. Если тип напрямую использует тип прокси, объявите предупреждение.

Предложения, советы, подсказки, указатели или ответы кому-либо?

1 Ответ

0 голосов
/ 22 апреля 2011

Существует несколько способов написания запроса с помощью Правило кода через LINQ Query (CQLinq) . Конечно, самый элегантный, лаконичный и оптимизированный способ это:

warnif count > 0
let soapClientTypes = Application.Types.Where(t => t.DeriveFrom("System.Web.Services.Protocols.SoapHttpClientProtocol"))
let mnteTypes = Application.Types.WithFullNameLike(@"MTNE.Web.OneWeb.^.*\p{Proxy}+$").ToHashSet()
from t in soapClientTypes.UsingAny(mnteTypes)
select new { t, 
             mnteTypesUsed = t.TypesUsed.Intersect(mnteTypes) }

Обратите внимание, как мы сначала определяем 2 набора , а также используем метод расширения ToHashSet () для оптимизации выполнения метода Intersect () .

Обратите внимание также на использование метода UsingAny () , который за один вызов выполняет большую работу.

...