在执行CQLinq查询时我遇到了一些问题。
我正在尝试使用指定的全名来获取过时的方法,这意味着我想具体指定FullName过时的方法。
结果应该弹出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个匹配,我们必须删除“&amp;&amp; oConcreteM.Contains(m.FullName)”代码,但我不想,我想要什么是检查名称是否匹配oConcreteM中的方法全名。 以下是输出给我的信息:
我希望那些人可以帮助我:)。
答案 0 :(得分: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 }