我需要找到从"System.Web.UI.Page"派生的所有类,这些类引用了从Page派生的另一个类。。。我在NDepend中尝试的所有东西要么什么都没有,要么每一页都没有。
我们最近将Asp.Net的"站点"转换为"web应用程序",在这个过程中发现许多页面的类名与数据库层中的类相同。它们在不同的命名空间中,但由于所有页面都在同一个命名空间中(现在在同一程序集中),我们遇到了一些问题。
大多数情况下,当页面使用数据层类并访问其成员时,这会导致编译错误,但现在所有页面都在Web应用程序中(因此可以相互查看),编译器决定它们引用的是网页类,而不是数据层类。我们担心某些类可能通过实现同名成员而躲过了编译时崩溃,因此我们希望找到.Net认为网页(从System.web.UI.Page继承(无论多么遥远)的类)引用另一个网页的任何位置。
显然,这个NDepend CQL只返回所有页面:
SELECT TYPES FROM ASSEMBLIES "UI"
WHERE IsUsing "System.Web.UI.Page"
AND DeriveFrom "System.Web.UI.Page"
有人知道这是否可能,或者我是否可以使用FXCop或其他东西编写规则吗?
我不知道使用CQL有任何方法可以做到这一点,尽管我还不是CQL专家,无法确定这是不可能的。另一方面,使用FxCop找到这样的问题是非常可行的。下面的规则代码应该可以找到你的问题,尽管它实际上只适合一次性筛选。如果你正在寻找可以永久包含在FxCop分析中的东西,那就需要对它进行一些想象。
private TypeNode PageType { get; set; }
private TypeNode FocalType { get; set; }
public override void BeforeAnalysis()
{
base.BeforeAnalysis();
this.PageType = FrameworkTypes.Page;
}
public override ProblemCollection Check(TypeNode type)
{
if (type.IsDerivedFrom(this.PageType))
{
this.FocalType = type;
this.Visit(type);
}
return this.Problems;
}
public override void VisitTypeReference(TypeNode type)
{
if ((type != null) && (type != this.FocalType) && type.IsDerivedFrom(this.PageType) && (!this.FocalType.IsDerivedFrom(type)))
{
this.Problems.Add(new Problem(this.GetResolution(type.FullName), type));
}
base.VisitTypeReference(type);
}
我们想找到.Net认为网页(一个从System.web.UI.Page继承(无论多么遥远)的类)引用另一个网页的任何地方。
Jaykul,这可以通过以下LINQ上的代码查询(CQLinq)来实现:
let pageTypes = Application.Assemblies.WithNameLike("UI")
.Where(t => t.DeriveFrom "System.Web.UI.Page")
from t in pageTypes
let pageTypesUsed = t.TypesUsed.Intersect(pageTypes)
where pageTypesUsed.Count() > 0
select new { t, pageTypesUsed }
此外,您还写道:
我们发现许多页面的类名与数据库层中的类相同
NDepend提出了200多个默认代码规则,其中之一是避免具有相同名称的不同类型