从 Roslyn 方法调用中的相应参数获取方法参数的名称

2024-01-10

我想知道是否有一些现有的逻辑可以通过查看该特定方法/构造函数的调用来获取有关其包含的方法/构造函数签名中的参数定义的名称(或任何其他相关信息)。基本上,我只是希望能够获得一个变量的默认名称,该名称将作为参数传递给调用。因此,如果一个方法定义如下:

public void Foo(object firstParam, object secondParam, object thirdParam)

我希望能够说以下调用的第二个参数

object bar = null;
this.Foo(null, bar, null)

预计名称为“secondParam”。基本上,我只想将一个参数与它在调用中占据“位置”的原始参数相关联。

我询问 Roslyn 中是否已经存在任何我不知道的 util 方法,因为需要处理一些更复杂的场景,例如命名或可选参数。我同时提出的解决方案应该涵盖一些情况,但可能不是全部(特别是参数,这应该需要一些更专门的逻辑来处理)。这是我到目前为止所拥有的:

    private IEnumerable<IdentifierNameSyntax> GetParameterNamesFromArgumentList(ArgumentListSyntax argumentList, SyntaxNodeAnalysisContext context)
    {
        var arguments = argumentList.Arguments;
        var parameters = argumentList.Parent.GetSymbolOrDeclaredAs<IMethodSymbol>(context)?.Parameters;

        if (parameters != null)
        {
            var index = 0;
            foreach (var parameter in parameters)
            {
                var argument = index < arguments.Count ? arguments[index] : null;

                if (argument != null && argument.NameColon == null)
                {
                    yield return SyntaxFactory.IdentifierName(parameter.Name);
                }
                else if (argument != null)
                {
                    yield return argument.NameColon.Name;
                }

                index++;
            }
        }
    }

我可以使用DeclaringSyntaxReferences在方法符号上,但我认为只要有来自IParameterSymbol足够适合我的需要。同样,如果这种逻辑已经在其他地方实现,我宁愿使用它。如果没有,请随时告诉我您对这个问题的看法。


遗憾的是,我认为没有一个好的公共方法可以做到这一点。查看罗斯林的内部DetermineParameter http://source.roslyn.io/Microsoft.CodeAnalysis.CSharp.Workspaces/R/af94352fb5da7056.html可能有帮助的事情的帮手。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Roslyn 方法调用中的相应参数获取方法参数的名称 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • 我在在线程序挑战编译器中遇到演示错误

    include
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • 轮询 Jenkins 作业中的条件 svn 签出

    我试图根据条件阻止 svn 轮询 Jenkins 作业上的 svn 签出 前置步骤在结账后执行 该作业通过 svn 轮询触发 请指教 有一个插件允许在 SVN 结账之前执行一个步骤 https wiki jenkins ci org dis
  • 注释 @EnableSpringDataWebSupport 不适用于 WebMvcConfigurationSupport?

    我已经使用 WebMvcConfigurerAdapter 一段时间了 由于我无法使用 getInterceptors 方法获取所有已注册的拦截器 因此我已切换到 WebMvcConfigurationSupport 它有很多默认注册的 S
  • SSL 安全 SaaS 应用程序的 URL 设计

    我正在使用 ASP NET MVC 平台开发一个应用程序 它将作为一项服务通过网络公开 SaaS http en wikipedia org wiki Software as a Service模型 我正在尝试确定为每个用户帐户划分 URL
  • 将静态库添加到同一解决方案中的项目 (Visual Studio 2012)

    我正在尝试创建一个将在项目中使用的静态库 该库编译良好并为其创建 lib 文件 为了测试我的代码 我向同一解决方案添加了另一个项目 当我尝试构建测试项目时 出现以下错误 错误 LNK1120 4 个未解析的外部 错误 LNK2019 函数
  • Mysql 慢查询日志正在记录更快的查询

    我在数据库服务器上设置了mysql慢查询日志 并将长查询时间设置为5 刚刚检查了日志及其日志查询 只需几毫秒 有人知道为什么会这样吗 这是一些日志 最后一个查询并不是最优化的 它说它检查了 450000 行 所以我在日志中看到它不会感到惊讶
  • 为 Jboss 启用 gzip 压缩

    Jboss 5 1 0 的 gzip 压缩是如何启用的 在 tomcat http 连接器内对吗 我不记得这个文件存储在哪里 server xml 编辑 jboss server default deploy jbossweb sar se
  • Go Flush() 不起作用

    请检查一下这个要点并告诉我 出了什么问题 为什么我看不到我的消息 要旨 https gist github com cnaize 895f61b762a9f5ee074c https gist github com cnaize 895f6
  • 如何在 Android 中使用 Intent 拨打电话?

    我正在使用以下代码在 Android 中拨打电话 但它给了我安全异常 请帮助 posted by 111 333 222 4 String uri tel posted by trim Intent intent new Intent In
  • 如何在 SQL 中找到连续的活跃周?

    我想做的是找到某人在周日活跃的连续周数并为其分配一个值 他们每天必须参加至少 2 场比赛才能算作本周的活跃比赛 如果它们连续 2 周活跃 我想指定值为 100 连续 3 周指定为 200 连续 4 周指定为 300 并持续最多连续 9 周
  • JUunit 测试用例中内部图形尚未初始化

    我正在使用 JavaFx 制作一个轻量级绘画应用程序 我的一些问题LayerController类及其方法addLayer所以我认为编写一些 JUnit 测试用例来检查我的方法的正确性是一个好主意 简而言之 我正在画一个Canvas使用它的
  • 如何创建具有格式的字符串?

    我需要创建一个String具有可以转换的格式Int Int64 Double等输入String 使用 Objective C 我可以通过以下方式做到这一点 NSString str NSString stringWithFormat d f
  • MySQL 类似断言的约束

    我是MySQL新手 我刚刚发现它不支持断言 我得到了这张表 CREATE TABLE guest ssn varchar 16 NOT NULL name varchar 200 NOT NULL surname varchar 200 N
  • UIImage 上的圆角

    我正在尝试使用圆角在 iPhone 上绘制图像 就像联系人应用程序中的联系人图像一样 我的代码通常可以工作 但它偶尔会在 UIImage 绘图例程中崩溃EXEC BAD ACCESS KERN INVALID ADDRESS 我认为这可能与
  • 为什么新的 AKSequencer 不发出任何声音?

    我有一个相当复杂的应用程序 到目前为止一直在使用 AKAppleSequencer 但由于该定序器时不时出现一些奇怪的行为和错误 我一直希望迁移到较新的 AKSequencer 不幸的是 新的音序器似乎没有在 Playgrounds 或太多
  • On Key Down 限制用户输入一些特殊字符

    我想限制用户在工具栏搜索中不允许他 她使用一些特殊字符 例如 gt tblFundComp bind keydown function e if e keyCode gt 48 e keyCode lt 57 return false el
  • Spring Security 配置 anyRequest().authenticated() 未按预期工作

    我对spring security配置的理解http anyRequest authenticated 是任何请求都必须经过身份验证 否则我的 Spring 应用程序将返回 401 响应 不幸的是 我的 spring 应用程序不会以这种方式
  • 如何解析命令行参数?

    我想解析 perl 脚本中的参数列表 例如我有这种情况 script pl h 127 0 0 1 u user p pass arg1 arg2 arg3 我该如何解析数组中不是选项的参数列表以及标量值中的选项参数 Thanks 好吧 如
  • 升级 3.0.3 -> 3.2.2 后,NServiceBus 端点寻找 RavenDB 超时

    使用 NuGet 我将项目中的所有 NServiceBus 引用从 3 0 3 升级到 3 2 2 对于此解决方案中的 4 个服务 我还为它们提供了对 NuGet 中的 NServiceBus Host 的引用 我将二进制文件部署到测试环境
  • formik中的submit Form、handleSubmit、onSubmit有什么区别?

    福米克医生说 https jaredpalmer com formik docs guides form submission https jaredpalmer com formik docs guides form submission
  • 从 Roslyn 方法调用中的相应参数获取方法参数的名称

    我想知道是否有一些现有的逻辑可以通过查看该特定方法 构造函数的调用来获取有关其包含的方法 构造函数签名中的参数定义的名称 或任何其他相关信息 基本上 我只是希望能够获得一个变量的默认名称 该名称将作为参数传递给调用 因此 如果一个方法定义如