1

我在执行 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 中的方法全名。这是输出给我的:

在此处输入图像描述

我希望你们在那里可以帮助我:)

4

1 回答 1

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 }
于 2013-07-10T11:37:08.493 回答