首页
学习
活动
专区
工具
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;
        }
    }
}

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

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

相关·内容

苏州 开源自主的 dotnet 生态

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

96720

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

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

1.7K10

从零开始学习 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

27840

.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 语言完全兼容。

27630

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

使用 RoslynC# 代码进行语义分析

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 // 获取成员的类型,然后忽略掉属性里面的方法。

42820

理解 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#)的语法。

1K10

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

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

1.1K30

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

94910

使用 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.2K80

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.3K10

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

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

70430

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

Roslyn 简单实现代码智能提示补全功能

本文将和大家简单介绍一下如何使用 Roslyn 实现简单的代码智能提示补全功能 现在的 dotnet C# 核心构建工具链是非常完善的且开放的,基于 dotnet 完善的构建核心能力,咱可以非常方便的在此基础之上构建咱的编译器相关的应用...本文实现的示例代码是全控制台的演示,没有涉及任何界面逻辑,大家可以在本文末尾找到本文使用的代码的下载方法 本文属于 Roslyn系列博客,前置知识还请大家自行 博客导航 了解 先介绍一下本文预期实现的功能...当然了,在阅读完成本文之后,相信大家也可以非常方便的换成自己的其他代码片段获取其补全信息 通过 Roslyn 实现智能补全的核心是通过 Microsoft.CodeAnalysis.Completion.CompletionService...的 GetCompletionsAsync 方法获取补全列表 本文提供的方法比 Roslyn如何实现简单的代码提示 - JackWang-CUMT - 博客园 博客使用的方法更加具有代码通用性,可以实现近似于...DocumentId.CreateNewId(project.Id), name: "LindexiCode", sourceCodeKind: SourceCodeKind.Script); 将文档直接添加到解决方案里面,用于获取

5010

ClassDescription

普通的反射可能只是动态来获取程序集里的元数据,然后操作或者运行它。而 Emit 可以完全动态的创建一个程序集或者类。那么让我们看看怎么用 Emit 来动态生成一个 class 吧。...Roslyn Roslyn 是微软最新开源的代码分析,编译工具。它提供了非常多的高级 API 来让用户在运行时分析代码,生成程序集、类。所以它现在是运行时代码生成的首选项。...那么使用的 Roslyn 的时候过程也是一样的。我们首先就是要使用代码来生成这个 User class 的字符串模板。然后把这段字符串交给 Roslyn 去分析与编译。...Natasha 如果还是觉得 Roslyn 操作起来麻烦,那么还可以使用 NCC 旗下开源项目 Natasha。Natasha 做为 Roslyn 的封装,所以放到 Roslyn 下面一起讲。...Natasha 是基于 RoslynC# 动态程序集构建库,该库允许开发者在运行时使用 C# 代码构建域 / 程序集 / 类 / 结构体 / 枚举 / 接口 / 方法等,使得程序在运行的时候可以增加新的模块及功能

53420

微软员工聊C#中的IDisposable接口

如果你真要回收全局哈希表里的 Foo 对象,你只需要把 Foo 对象哈希表里面删掉就可以了。...而且源代码里的注释看来,HashAlgorithm 的这个方法确实是为了释放资源,而不是为了什么安全考虑。...这种“全局”,是程序语言语义的角度来看的。文件很像程序里的全局变量,无论什么地方都可以访问。 使用文件的时候,你使用文件名来读写它,任何知道这个名字的进程都可以访问这个文件。...官方文档和 Roslyn 静态分析不可靠 微软官方文档和 Roslyn 静态分析说一定要调用 Dispose,其实是把不是问题的问题拿出来,让没有深入理解的人心惊胆战。...很多人把 Roslyn 静态分析的结果很当回事,而其实看了 Roslyn 静态分析的源代码之后,我发现他们关于 Dispose 的静态分析实现,是相当幼稚的作法。

20940
领券