【问题标题】:ndepend; get method's arguments依赖;获取方法的参数
【发布时间】:2025-12-30 09:25:11
【问题描述】:

如何使用 CQLINQ 获取当前方法的输入参数集合?有任何集合,如“Arguments”或“Parameters”,只有“NbParamenter”,不适合我的目的。

【问题讨论】:

    标签: ndepend


    【解决方案1】:

    确实,CQLinq 还没有这个功能。但是,在许多情况下,您可以弥补这一点,因为属性ICodeElement.NameIMember.FullName,对于IMethod,包含以逗号分隔的参数类型名称列表。例如这里是一个方法的FullName

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

    这是它的Name

    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".
    

    【讨论】:

    • 如果您只需要类型,这很好,但如果您想查找特定的参数名称,则无济于事:(
    • nDepend 6 解决了这个问题吗?我想获取参数列表及其属性(如果有)。例如[CallerMemberName]。正如 tjrobinson 提到的,上面的代码在我们的例子中似乎没有帮助。
    • 在 NDepend 6.2.1 和 CQLinq 1.9 中仍然没有这样的功能。可惜。
    • 据我所知,方法名称解决方案也不允许您查找已添加到方法中的可选参数。这是不幸的,因为可选参数可能会给您的 API 引入重大更改,并且警告它们的方法会很好。有什么额外的事情要做吗?
    • 我需要检查参数的来源,以确保业务逻辑不会被其他模块的类型污染。所以允许调用另一个模块的API并消费它的数据,但它必须转换成本地数据结构。理想情况下,我会检查方法中的参数命名空间是否来自我的命名空间。那可能吗?这应该与上述功能相匹配。