【问题标题】:NDepend small issue checking obsolete method nameNDepend 检查过时方法名称的小问题
【发布时间】:2013-07-10 06:53:22
【问题描述】:

我在执行 CQLinq 查询时遇到了一个小问题。

我正在尝试使用指定的全名获取已过时的方法,这意味着我想具体指定全名已过时的方法。

结果应该会弹出 5 个匹配项,这意味着应该包含已过时的 callMe() 方法:

但是,当我执行此查询时, callMe() 不包括在内!

// <Name>Don't use obsolete types, methods or fields</Name>   
warnif count > 0
let oConcreteM =  new String[] {"usageAssembly.Class1.callMe()"}

let obsoleteTypes = Types.Where(t => t.IsObsolete)
let obsoleteMethods = Methods.Where(m => m.IsObsolete 
&& oConcreteM.Contains(m.FullName)).ToHashSet() //TODO HERE!! (Specify callMe())



from m in JustMyCode.Methods.UsingAny(obsoleteTypes).Union(
      JustMyCode.Methods.UsingAny(obsoleteMethods)).Union(
      JustMyCode.Methods.UsingAny(obsoleteFields))

let obsoleteTypesUsed = obsoleteTypes.UsedBy(m)

// Optimization: MethodsCalled + Intersect() is faster than using obsoleteMethods.UsedBy()
let obsoleteMethodsUsed = m.MethodsCalled.Intersect(obsoleteMethods)
let obsoleteFieldsUsed = obsoleteFields.UsedBy(m)
select new { m,obsoleteTypesUsed, obsoleteMethodsUsed, obsoleteFieldsUsed }

通过上面的查询,callMe() 消失了,但要获得 5 个匹配项,我们必须删除“&& oConcreteM.Contains(m.FullName)”代码但我不想,我想要的是检查如果名称与 oConcreteM 中的方法全名匹配。 这是输出给我的:

希望大家能帮帮我:)

【问题讨论】:

    标签: c# linq ndepend cqlinq


    【解决方案1】:

    所以回答应该是什么问题:

    我想列出通过字符串列表定义的方法(定义全名),这些方法已过时 + 对于每个匹配的方法,列出已使用的过时类型/方法/字段

    let methods=  Application.Methods.WithFullNameIn(
                             "Namespace1.Class1.Method1()", 
                             "Namespace2.Class2.Method2()") // Put more full names here
                             .Where( m => m.IsObsolete)
    
    from m in methods
    // Here we cannot easily define m.TypesUsed, hence we use an astute
    let obsoleteTypesUsed = m.ParentType.TypesUsed.Where(t => t.IsObsolete).Where(t => t.IsUsedBy(m))
    let obsoleteMethodsUsed = m.MethodsCalled.Where(m1 => m1.IsObsolete)
    let obsoleteFielsUsed = m.FieldsUsed.Where(f => f.IsObsolete)
    select new { m, obsoleteTypesUsed, obsoleteMethodsUsed, obsoleteFielsUsed }
    

    【讨论】:

    • 还是一样,我也想把 callMe() 打印出来。但话又说回来,它似乎只给了“4 个方法匹配”,但我想要“5 个方法匹配”
    • 这意味着我想只打印出 oConcreteM 中给出的那些方法,而忽略任何其他过时的方法。如果可能的话
    • 你想在哪里只打印出 oConcreteM 中给出的那些方法?在第一列还是在另一列?如果在另一列中,那么您希望在第一列中看到哪个代码元素?
    • 在第一列。我想使用给定的代码获得图 1 上的结果,我希望它不会像我包含“&& oConcreteM.Contains(m.FullName)).ToHashSet()”时那样忽略“callMe()”。
    • 我无法理解你想要做什么的逻辑。用简单的英语描述您的查询,例如:“我想列出名称为 CallMe() 的方法,这些方法使用任何过时的类型/方法/字段 + 对于每个匹配的方法,列出使用的过时类型/方法/字段”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多