C# 独立小问题检查过时的方法名称
我在执行CQLinq查询时遇到了一个小问题 我正在尝试获取使用指定的全名过时的方法,这意味着我要指定使用全名过时的方法 结果应弹出5个匹配项,这意味着应包括过时的callMe()方法: 但是,执行此查询时不包括callMe()C# 独立小问题检查过时的方法名称,c#,linq,ndepend,cqlinq,C#,Linq,Ndepend,Cqlinq,我在执行CQLinq查询时遇到了一个小问题 我正在尝试获取使用指定的全名过时的方法,这意味着我要指定使用全名过时的方法 结果应弹出5个匹配项,这意味着应包括过时的callMe()方法: 但是,执行此查询时不包括callMe() // <Name>Don't use obsolete types, methods or fields</Name> warnif count > 0 let oConcreteM = new String[] {"usageAs
// <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 }
//不要使用过时的类型、方法或字段
如果计数大于0,则警告
让oConcreteM=newstring[]{“usageAssembly.Class1.callMe()”}
让obsoleteTypes=Types.Where(t=>t.IsObsolete)
设ObsoletMethods=方法,其中(m=>m.Isobsolite
&&oConcreteM.Contains(m.FullName)).ToHashSet()//TODO HERE!!(指定callMe())
从JustMyCode.Methods.UsingAny(obsoleteTypes.Union)中的m开始(
JustMyCode.方法.使用任何(废弃方法)).联合(
JustMyCode.方法.使用任何(废弃场)
let obsoleteTypesUsed=obsoleteTypes.UsedBy(m)
//优化:MethodScaled+Intersect()比使用ObsoletMethods.UsedBy()更快
让ObsoletMethodsUsed=m.MethodScaled.Intersect(ObsoletMethods)
let obsoleteFields used=obsoleteFields.UsedBy(m)
选择新建{m,废弃类型使用,废弃方法使用,废弃字段使用}
在上面的查询中,callMe()消失了,但要获得5个匹配项,我们必须删除“&&oConcreteM.Contains(m.FullName)”代码,但我不想这样做,我想检查的是oConcreteM中的方法FullName中的名称是否匹配。
以下是输出给我的信息:
我希望你们能帮我:)所以要回答这个问题: 我想列出通过字符串列表(定义全名)定义的方法,这些字符串是过时的+对于每个匹配的方法,列出使用的过时类型/方法/字段
因此,要回答这个问题: 我想列出通过字符串列表(定义全名)定义的方法,这些字符串是过时的+对于每个匹配的方法,列出使用的过时类型/方法/字段
还是一样,我希望callMe()也打印出来。但话说回来,它似乎只给med提供了“4种匹配的方法”,但我想要“5种匹配的方法”,这意味着我只想打印出oConcreteM中给出的方法,而忽略任何其他过时的方法。如果可能的话,您想在哪里只打印出oConcreteM中给出的那些方法?在第一列中还是在另一列中?如果在另一列中,那么您希望在第一列中看到哪个代码元素?在第一列中。我想用给定的代码得到图1的结果,我希望它不要像我包含“&&oConcreteM.Contains(m.FullName)).ToHashSet()”时那样忽略“callMe()”。我无法理解您想要做的逻辑。用简单的英语描述您的查询,例如:“我想列出名为CallMe()的方法,这些方法使用任何过时的类型/方法/字段+对于匹配的每个方法,列出使用的过时的类型/方法/字段”仍然相同,我想打印CallMe()。但话说回来,它似乎只给med提供了“4种匹配的方法”,但我想要“5种匹配的方法”,这意味着我只想打印出oConcreteM中给出的方法,而忽略任何其他过时的方法。如果可能的话,您想在哪里只打印出oConcreteM中给出的那些方法?在第一列中还是在另一列中?如果在另一列中,那么您希望在第一列中看到哪个代码元素?在第一列中。我想用给定的代码得到图1的结果,我希望它不要像我包含“&&oConcreteM.Contains(m.FullName)).ToHashSet()”时那样忽略“callMe()”。我无法理解您想要做的逻辑。用简单的英语描述您的查询,例如:“我想列出名为CallMe()的方法,这些方法使用任何过时的类型/方法/字段+对于每个匹配的方法,列出使用的过时类型/方法/字段”
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 }