【问题标题】:How can you tell if a parameter is standard, output, or reference?如何判断参数是标准参数、输出参数还是引用参数?
【发布时间】:2014-10-06 16:01:24
【问题描述】:

我发现 this great resource 解释了如何使用 .NET 反射来确定标准、输出或参考参数。

现在,我想使用 EnvDTE 做同样的事情。 the documentation 中似乎没有任何明显的方法。那么如何做到这一点呢?

如果没有必要,我不想求助于字符串解析,但如果没有其他方法,我会接受它作为答案(只要你展示一个例子)。

关于相关说明 - 如何使用 DTE 确定可选参数的默认值?

一些背景

我正在为 Visual Studio IDE(单个文件生成器)创建一个扩展。它读取项目代码文件并查找使用某些自定义属性修饰的接口,然后检索有关接口的所有成员和继承成员的信息。最终目标是基于这些接口生成完全实现的方法和属性。我让它适用于标准参数,但要弄清楚如何让它识别 ref、out 和可选参数被证明是困难的。

【问题讨论】:

  • 根据我的经验,DTE 很少是解决问题的方法。如果您可以提供有关您要解决的确切问题的更多信息,它将帮助我提供最佳答案。
  • 我更新了我的问题。谢谢。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。

标签: c# .net system.reflection envdte


【解决方案1】:

您可以将CodeParameter 转换为CodeParameter2 接口。
注意:您必须添加对EnvDTE80.dll 程序集的引用。

之后,您可以分析其ParameterKind 属性,例如:

CodeFunction function = ...;
foreach (CodeParameter2 param in function.Parameters)
{
    if (param.ParameterKind == vsCMParameterKind.vsCMParameterKindNone)
    {
        // standard parameter
    }
    else if (param.ParameterKind == vsCMParameterKind.vsCMParameterKindOptional)
    {
        // optional parameter
    }
    else if (param.ParameterKind == vsCMParameterKind.vsCMParameterKindOut)
    {
        // out parameter
    }
    else if (param.ParameterKind == vsCMParameterKind.vsCMParameterKindRef)
    {
        // reference parameter
    }
}

关于:

关于相关说明 - 如何使用 DTE 确定可选参数的默认值?

如果参数是可选的,您可以使用DefaultValue 属性来获取或设置其默认值。


作为旁注,当EnvDTE type 没有提供所需的功能时,我建议的第一件事是寻找具有更高版本号的类型:

CodeParameter => CodeParameter2
Debugger => Debugger2 => ... => Debugger5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2016-06-11
    • 2017-12-27
    • 2011-02-10
    相关资源
    最近更新 更多