首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c# Roslyn从ArgumentSyntax获取IParameterSymbol

c# Roslyn是一个开源的编译器平台,用于分析和修改C#和Visual Basic代码。它提供了一组API,可以在编译过程中访问和操作语法树、符号和语义信息。

ArgumentSyntax是Roslyn中表示方法参数传递的语法节点。通过ArgumentSyntax,我们可以获取传递给方法的参数的相关信息。

要从ArgumentSyntax获取IParameterSymbol,可以按照以下步骤进行操作:

  1. 获取ArgumentSyntax所在的方法调用表达式。可以使用Parent属性获取父节点,然后使用递归或循环向上遍历语法树,直到找到MethodInvocationExpressionSyntax或InvocationExpressionSyntax节点。
  2. 从方法调用表达式中获取对应的方法符号(IMethodSymbol)。可以使用SemanticModel来获取方法调用表达式的语义信息。首先,需要获取方法调用表达式的位置(Location),然后使用SemanticModel的GetSymbolInfo方法来获取方法符号。
  3. 通过方法符号获取方法的参数列表(IParameterSymbol[])。可以使用Parameters属性来获取方法的参数列表。
  4. 遍历方法的参数列表,找到与ArgumentSyntax对应的参数。可以使用ArgumentList属性来获取方法调用表达式中的参数列表,然后使用位置信息(Location)或其他属性来匹配参数。
  5. 获取对应的参数符号(IParameterSymbol)。可以使用SymbolEqualityComparer来比较参数的位置信息,然后获取对应的参数符号。

以下是一个示例代码,演示如何从ArgumentSyntax获取IParameterSymbol:

代码语言:txt
复制
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

// 获取ArgumentSyntax所在的方法调用表达式
MethodInvocationExpressionSyntax methodInvocation = argumentSyntax.Parent as MethodInvocationExpressionSyntax;

// 获取方法调用表达式的方法符号
IMethodSymbol methodSymbol = semanticModel.GetSymbolInfo(methodInvocation).Symbol as IMethodSymbol;

// 获取方法的参数列表
IParameterSymbol[] parameters = methodSymbol.Parameters.ToArray();

// 遍历参数列表,找到与ArgumentSyntax对应的参数
foreach (ArgumentSyntax argument in methodInvocation.ArgumentList.Arguments)
{
    // 获取参数的位置信息
    Location argumentLocation = argument.GetLocation();

    // 在参数列表中查找对应的参数
    foreach (IParameterSymbol parameter in parameters)
    {
        // 使用位置信息比较参数
        if (semanticModel.GetSymbolInfo(parameter.DeclaringSyntaxReferences[0].GetSyntax()).Symbol.Locations.Contains(argumentLocation))
        {
            // 找到对应的参数符号
            IParameterSymbol parameterSymbol = parameter;
            // 进行后续操作
            break;
        }
    }
}

请注意,以上代码仅为示例,具体实现可能需要根据实际情况进行调整。另外,腾讯云相关产品和产品介绍链接地址可以根据具体需求和场景进行选择,可以参考腾讯云官方文档或咨询腾讯云的技术支持团队获取更详细的信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码

更新于 2018-06-02 01:26 Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性。...语法重写——Syntax Rewriter Roslyn 对 C# 代码进行分析的一个非常关键的 API 是 CSharpSyntaxRewriter——这是一个专门用来给你继承的类。...我们每个人都可能会写出不同的基于 Roslyn 的分析器,这些分析器通常都会对不同文件的 C# 语法树进行不同的操作;于是,我们通过重写 CSharpSyntaxRewriter 可以实现各种各样不同的操作...在访问者模式中,由于 C# 的语法在一个 C# 版本发布之后就会确定,其中各种各样类型的语法对应访问者模式中的各种不同类型的数据,Roslyn 为我们构建的语法树对应访问者模式中需要访问的庞大的数据结构...访问泛型参数 现在,我们继续在之前打开解决方案和项目文件的代码后面增添代码: // 从我们一开始打开的项目文件中获取语法树。

1.8K10

苏州 开源自主的 dotnet 生态

本文仅仅只是用来在2020苏州开发者大会上的素材,开发者大会成功完成,本文也可以公开 从编程语言版权,到编译器到运行时的开源,和允许自己分发和构建 从咱写下的 C# 代码,到在机器上运行的应用,有多少个步骤是咱可以自主的...当然了答案肯定是可以的 从 Roslyn 编译器开始,整个 Roslyn 编译器是采用 C# 编写的,依托于 dotnet 运行时运行。...从咱写下的 C# 代码,到在机器上运行的应用,有多少个步骤是咱可以自主的?【停顿一下,聚拢一下注意力】尽管答案大家都知道,那就是完全开源完全可控。...从写下 Hello World 的 C# 代码到控制台打印出来,咱用到了 dotnet 里面多少的技术? 现在是 2020 年,几乎所有的高级语言都需要经过编译才能运行,咱的 C# 也不例外。...【停顿】这个 Roslyn 编译器很有意思,因为这是一个一半用 C# 一半用 VB 写的编译器,这是一个多么有趣的套娃游戏:用 C# 写的 Roslyn 编译器来编译 C# 代码。

97720
  • 从零开始学习 dotnet 编译过程和 Roslyn 源码分析

    本文整理我和 林德熙 学习的 dotnet 编译知识、Roslyn 源码分析知识,NuGet 知识。通过阅读本文可以从零散的碎片化博客中得到从零开始学习的轨迹。...以下是这部分的性能数据: C# 程序集数量对软件启动性能的影响 - 林德熙 不过,程序集中的类的数量对启动性能没有影响: C# 直接创建多个类和使用反射创建类的性能 - 林德熙 SourceFusion...以下是这部分的性能数据: C# 性能分析 反射 VS 配置文件 VS 预编译 - 林德熙 额外的,如果不是收集而单单只是使用的话,这里是性能数据: C# 直接创建多个类和使用反射创建类的性能 - 林德熙...dotnet build 基础 你需要先了解 csproj 文件的结构,以便进行后续的学习: 理解 C# 项目 csproj 文件格式的本质和编译流程 - 吕毅 项目文件中的已知属性(知道了这些,就不会随便在...: 自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference - 吕毅 如何最快速地将旧的 NuGet 包 (2.x, packages.config

    42540

    .Net 编译器平台 --- Roslyn

    Roslyn 支持 C# 和 VB.NET 两种编程语言。它提供了一组通用 API,这样两种语言之间共享代码就变得容易。...Roslyn 与 Visual Studio、Visual Studio Code 和其他支持 C# 和 VB.NET 的 IDE 集成很好。...从解析器获取的语法树完全可逆地回到其解析的文本。从任何语法节点,都可以获取以该节点为根的子树的文本表示。这意味着语法树可以用作构建和编辑源代码的一种方式。...一旦您从工作区的CurrentSolution属性获取解决方案实例,该实例将不会发生更改。然而,与语法树和编译类似,您可以通过基于现有解决方案和特定更改构建新实例来修改解决方案。...5.png 总结 Roslyn 提供了一套编译器 API 和工作区 API,可以提供有关您的源代码的丰富信息,并与 C# 和 Visual Basic 语言完全兼容。

    33930

    使用 Roslyn 对 C# 代码进行语义分析

    Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性。以至于我们只需要编写很少量的代码便能够分析我们的源代码。之前我写过一些使用 Roslyn 进行语法分析的文章。...关于代码分析器(Analyzer)和修改器(CodeFix)可以参考我之前的这些博客: 可参考:基于 Roslyn 同时为 Visual Studio 插件和 NuGet 包开发 .NET/C# 源代码分析器...第二步:获取语义模型和语义符号 使用这句,可以拿到一个语法树的语义模型: 1 var semanticModel = compilation.GetSemanticModel(syntaxTree);...你可以简单地获得类型的命名空间,获得类型的特性(Attribute);获得类型的成员,成员的特性…… 1 2 // 获取类型的命名空间。...var members = classDeclarationSymbol.GetMembers(); 1 2 3 4 5 6 7 8 9 10 // 获取成员的类型,然后忽略掉属性里面的方法。

    62520

    Roslyn 如何获得一个类的引用

    本文告诉大家如何在 Rosyln 编译一个文件,获得这个文件的类的命名空间 在 C# 代码里面,大部分的代码都是在开始定义了 using 引用命名空间,本文将告诉大家如何使用 Roslyn 分析获取类文件里面引用的命名空间...Include="Microsoft.CodeAnalysis.Compilers" Version="3.10.0" /> 上面代码使用了 3.10 版本,这个版本支持了 C#...开发,对 C# 语言编写的文件,将会被读为语法树,但是语法树很复杂,此时就需要一个辅助的类去读取对应的逻辑。...但是 ModelCollector 类还没有任何的代码,期望获取当前类文件的 using 引用文件,可以通过在 ModelCollector 重写 VisitUsingDirective 方法的方式获取...,进入 KeneenejajiqairCalllebolayere 文件夹 更多关于 Roslyn 请看 手把手教你写 Roslyn 修改编译 本文会经常更新,请阅读原文: https

    1.3K20

    理解 Roslyn 中的红绿树(Red-Green Trees)

    理解 Roslyn 中的红绿树(Red-Green Trees) 2018-07-19 11:48 Roslyn 的 API 是非常易用的。...即便如此复杂的 C# 语法,建立的复杂的 C# 语法树,还有其复杂的树遍历和修改过程,也都被其 API 包装得干净简洁。 而这背后是它的重要设计思路 —— 红绿树。...---- 红绿树的影子 如果你是通过搜索找到这篇文章的,那么至少证明你调试过 Roslyn API 的使用,或者阅读过 Roslyn 的源码。...中获取红树的源代码 源代码摘抄自:roslyn/SyntaxNode.cs at master · dotnet/roslyn。...Roslyn 的设计理念 Roslyn 一开始就将漂亮的 API 作为目标的一部分,同时还要非常高的性能;所以 Roslyn 的开发团队需要找到一种特殊的数据结构来描述语言(如 C#)的语法。

    1.5K10

    动态代码框架发布-CZGL.Roslyn

    CZGL.Roslyn 开源项目位置:https://github.com/whuanle/CZGL.CodeAnalysis 基于 Roslyn 技术的 C# 动态代码构建器以及编译器,开发者可以使用此库动态构建...C# 代码,并且通过指定条件编译代码。...快速从表格等各种数据来源,生成代码; 自定义 UI 生成器,通过拖拉控件生成代码; ... ......如果你查阅资料会发现,Type.IsClass 可以识别出类、委托; 以下代码为什么 JAVA 和 C# 执行结果不同?...处于初版,代码还处于非常简单的状态,逻辑也很简单,因此,如果你有意学习 C# 中的反射、动态代码技术等,想了解源代码在生成后如何通过反射获得信息、源代码会被如何编译等,CZGL.Roslyn 就是你最佳的选择

    1.1K30

    CS-Script:一个非常成熟的C#脚本开源引擎

    引言 在.NET生态系统中,CS-Script是一个非常成熟的C#脚本开源引擎,它允许开发者使用C#语言编写脚本,而无需构建完整的应用程序。...目前,它支持Mono、Roslyn和CodeDOM等多种编译器。这意味着开发者可以根据项目需求和运行环境选择合适的编译器,无需修改脚本代码。...例如,在.NET Core环境下,CS-Script.Core包支持Roslyn编译器,能够充分利用Roslyn的强大功能。 3....以下是一些示例: 执行完整的C#文件:可以直接在命令行中使用cscs命令执行C#脚本文件。...兼容性:支持从.NET Framework 2.0到.NET 6.0的多个版本。 社区支持 CS-Script有一个活跃的社区,开发者可以在社区中获取帮助、分享经验和反馈问题。

    7300

    C# 从零开始写 SharpDx 应用 从 D3DDevice 获取 DXGIDevice 方法

    本文将告诉大家在拿到了 D3D11 的 Device 也就是 D3DDevice 之后,如何去获取 DXGI.Device 以及 DXGI.Factory 的方法 本文是 SharpDX 系列博客,更多博客请点击...SharpDX 系列 在 C# 从零开始写 SharpDx 应用 初始化dx修改颜色 这篇博客完成了基础的初始化 而接下来如何根据之前的代码,也就是如何根据上一篇博客创建的 D3D11.Device 来创建对应的...QueryInterface 可以拿到 DXGI.Device 对象 var dxgiDevice = _d3DDevice.QueryInterface(); 而通过 DXGI.Device 获取...,在拿到 DXGI.SwapChain _swapChain 对象,就可以使用下面代码获取工厂 var dxgiFactory2 = _swapChain.GetParent(); var dxgiDevice2 = _swapChain.GetDevice(); 可以看到这两个方法获取的对象是相同的,如下面代码 if

    1K10

    使用 Roslyn 编译器服务

    .NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service",简单的讲,就是就是将编译器开放为一种可在代码中调用的服务...你可以编写某种语言的语法规则,Antlr会为你生成代码],基于Antlr 有一个轻量级的C#编译器服务Expression Evaluator 。...要在自己的代码中使用Roslyn 执行C#脚本,首先进行如下几步准备工作。...,执行一个脚本还是比较简单的, 可以通过Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.RunAsync() 函数执行自己的脚本了,如果我们要获取脚本的返回值...Roslyn提供了一个更为简单有效的解决办法:在会话中传入一个宿主对象,会话中的脚本程序也能访问宿主对象的各成员变量。

    1.3K80

    Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码

    更新于 2018-06-02 01:26 Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性。....NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码(本文) Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码 我们希望做什么?...我曾经在 生成代码,从 T 到 T1, T2, Tn —— 自动生成多个类型的泛型 一文中提到过这样的想法,在这篇文章中,我希望只编写泛型的一个参数的版本 Demo,然后自动生成 2~16 个参数的版本...准备一份用于编译和执行代码文件 我直接使用 生成代码,从 T 到 T1, T2, Tn —— 自动生成多个类型的泛型 这篇文章中的例子。把其中最关键的文件拿来用于编译和生成试验。...参考资料 Compiling C# Code Into Memory and Executing It with Roslyn - Tugberk Ugurlu’s Blog 本文会经常更新,

    1.4K10

    C#.NET.NET Core技术前沿周刊 | 第 22 期(2025年1.13-1.19)

    文章地址: https://mp.weixin.qq.com/s/d2lZ4PpA1-VdMFl5iLcHkQ 一个基于 Roslyn 和 AvalonEdit 的跨平台 C# 编辑器 文章简介: 今天大姚给大家分享一个基于...Roslyn 和 AvalonEdit 开源、轻量、跨平台的 C# 编辑器:RoslynPad。...devblogs.microsoft.com/dotnet/net-and-net-framework-january-2025-servicing-releases-updates 用纯.NET开发并制作一个智能桌面机器人(一):从....文章地址: https://www.cnblogs.com/GreenShade/p/18667671 用纯.NET开发并制作一个智能桌面机器人(二):用.NET IoT库编写驱动控制两个屏幕 文章简介: 从....Winform 通过 NAudio 获取控制电脑操作系统音量 文章简介: C# Winform 通过 NAudio 获取控制电脑操作系统音量。

    9310

    IIncrementalGenerator 增量 Source Generator 生成代码入门 从语法到语义 获取类型完全限定名

    本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,如何从语法分析过程,将获取的语法 Token 转换到语义分析上,比如获取类型完全限定名...可通过阅读 Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码(语法分析) - walterlv 和 使用 Roslyn 对 C# 代码进行语义分析 - walterlv 博客对此进行了解...ClassDeclarationSyntax 类型,这是因为在前面语法部分限制了 IsKind(SyntaxKind.ClassDeclaration) 决定这里一定是类型定义 使用 SemanticModel 属性从语法...; 如此即可完成从语法分析到语义分析。...根据 使用 Roslyn 对 C# 代码进行语义分析 - walterlv 博客的示例,可以了解到拿到 symbolInfo 对象之后,即可获取到当前语法 Program 对应的类型,约等于拿到反射的

    78930

    Compilify——让你在浏览器中编译.NET代码

    Compilify是一款以服务形式出现的在线编译器,其创始人是Justin Rusbatch,它运行在Roslyn CTP[1]之上。从最近开始,它已得到来自.NET社区的大量关注。...灵感的主要来源之一就是Roslyn CTP给Visual Studio带来的C#交互窗口(C# Interactive window)。...译注 [1] Roslyn CTP,传统上,编译器都是黑盒——源代码从一端进入,然后对象文件或程序集从另一端出来。Roslyn项目通过开放VB和C#编译器改变了这种模型。...通过微软的“Roslyn”CTP(即Community Technology Preview,社区技术预览版)版可预览新的语言对象模型,该模型用于代码生成、分析和重构,还有即将到来的脚本支持、及C#与VB...更多内容请参阅Microsoft “Roslyn” CTP下载页面。

    1.3K80

    第二章 X# 的历史渊源及其理念

    通过 X#,他们可以将自己的应用程序从现有的Win32 环境转移到任何支持 .Net 的平台上。我们希望通过这种方式延长用 XBase 语言编写的现有产品的使用寿命。...Roslyn 的影响 您可能在多个场合看到过这样的一句话:X# "位于"Roslyn之上(可以这么说),或基于Roslyn,或依赖于Roslyn。...2.1:Roslyn 编译器管道 即使 X# 开发人员对 Roslyn 一无所知和/或根本不关心(这两点都是合理的),每个 X# 开发人员也应该了解其中的两点: 1.Roslyn 可使开发人员轻松为Visual...Studio 代码编辑器编写编码助手 2.Roslyn 可使X# 开发团队轻松实现 C# 语言的最新功能 第 2 点尤其令人信服,因为我们可以预期,C# 新版本(请记住,2022 年C# 已是第 11...版--C#版本概览)中的大多数功能迟早会在X# 中予以实现。

    12210
    领券