NDepend:获取方法的参数

4

我该如何使用CQLINQ来获取当前方法的输入参数集合?是否有像“Arguments”或“Parameters”这样的集合,而不是“NbParamenter”这样的集合,因为它不适合我的目的。

1个回答

3

实际上,CQLinq目前还没有这个功能。但是,在许多情况下,由于属性ICodeElement.NameIMember.FullName(对于IMethod)包含参数类型名称的逗号分隔列表,您可以进行补偿。例如,这里是一个方法的FullName

System.Windows.Forms.Control.BeginInvoke(Delegate,Object[])

这里是它的名称

BeginInvoke(Delegate,Object[])

以下是一个使用参数类型名称匹配事件处理程序方法的CQLinq规则示例:
// <Name>Event handler methods should be declared private</Name>
warnif count > 0
from m in Application.Methods where 
  !m.IsPrivate &&

   // A method is considered as event handler if...
   m.NbParameters == 2 &&            // ...it has two parameters..
   m.Name.Contains("Object") &&    // ...of types Object...
   m.Name.Contains("EventArgs") && // ...and EventArgs

   // Discard special cases
  !m.ParentType.IsDelegate &&
  !m.IsGeneratedByCompiler

select new { m,m.Visibility }
// This rule implementation relies on the facts that:
// -> A method name contains the type of its parameters.
// -> All EventArgs derived types have the suffix "EventArgs".

1
这很好,如果你只想要类型,但是如果你想查找特定参数名称,它就没有帮助了 :( - Tom Robinson
nDepend 6解决了这个问题吗?我想获取参数列表及其任何属性,例如[CallerMemberName]。正如tjrobinson所提到的,上述代码似乎对我们的情况没有帮助。 - user585968
据我所知,方法名“solution”也不能让您查找已添加到方法中的可选参数。这很不幸,因为可选参数可能会对您的API引入破坏性更改,因此警告它们的一种方法将是不错的选择。是否需要采取其他措施? - user2719430
不,我们目前没有更多的方法参数支持,但这肯定会成为未来功能的一部分。 - Patrick from NDepend team
1
我需要检查参数来自哪里,以确保业务逻辑不会被其他模块的类型污染。因此,允许调用另一个模块的API并使用其数据,但必须将其转换为本地数据结构。理想情况下,我会检查方法中的参数命名空间是否来自我的命名空间。这是否可能?这应该与上述功能相匹配。 - boskicthebrain
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接