1

我需要找到从“System.Web.UI.Page”派生的所有类,这些类引用从 Page 派生的另一个类......我在 NDepend 中尝试的所有内容都没有给我任何东西,或者每个页面。

我们最近将一个 Asp.Net“站点”转换为“Web 应用程序”,在此过程中发现许多页面与我们数据库层中的类具有相同的类名。它们在不同的命名空间中,但由于所有页面都在同一个命名空间中(现在,在同一个程序集中),我们遇到了一些问题。

大多数情况下,当页面使用数据层类并访问它的成员时,这会导致编译错误,但现在所有页面都在 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 或其他东西编写规则?

4

2 回答 2

1

我不知道有什么方法可以使用 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);
}
于 2012-02-15T19:33:13.710 回答
0

我们希望找到 .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 多个默认代码规则,其中之一是避免具有相同名称的不同类型

于 2012-02-16T04:40:18.933 回答