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

如何在Roslyn C#中从AttributeArgumentListSyntax获取(名称,类型)

在Roslyn C#中,可以通过以下步骤从AttributeArgumentListSyntax中获取(名称,类型):

  1. 首先,需要获取到AttributeArgumentListSyntax节点。AttributeArgumentListSyntax表示属性参数列表,它包含了一组属性参数。
  2. 然后,遍历AttributeArgumentListSyntax的Arguments属性,该属性返回一个SeparatedSyntaxList<AttributeArgumentSyntax>,表示属性参数的列表。
  3. 对于每个AttributeArgumentSyntax节点,可以通过其NameColon属性获取参数的名称。如果该属性为null,则表示参数没有指定名称。
  4. 对于每个AttributeArgumentSyntax节点,可以通过其Expression属性获取参数的表达式。通过分析表达式的类型,可以获取参数的类型信息。

下面是一个示例代码,演示了如何从AttributeArgumentListSyntax中获取(名称,类型):

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

public class AttributeArgumentVisitor : CSharpSyntaxWalker
{
    public override void VisitAttributeArgumentList(AttributeArgumentListSyntax node)
    {
        foreach (var argument in node.Arguments)
        {
            string name = null;
            string type = null;

            if (argument.NameColon != null)
            {
                name = argument.NameColon.Name.Identifier.ValueText;
            }

            var semanticModel = GetSemanticModel(argument.SyntaxTree);
            var argumentType = semanticModel.GetTypeInfo(argument.Expression).Type;
            if (argumentType != null)
            {
                type = argumentType.ToDisplayString();
            }

            // 在这里可以使用获取到的名称和类型进行后续处理
            // ...

            // 示例输出
            Console.WriteLine($"名称: {name}, 类型: {type}");
        }

        base.VisitAttributeArgumentList(node);
    }

    private static SemanticModel GetSemanticModel(SyntaxTree syntaxTree)
    {
        var compilation = CSharpCompilation.Create("Temp")
            .AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location))
            .AddSyntaxTrees(syntaxTree);

        return compilation.GetSemanticModel(syntaxTree);
    }
}

public class Program
{
    public static void Main()
    {
        string code = @"
            using System;

            [MyAttribute(42, Name = ""John"")]
            public class MyClass
            {
            }

            public class MyAttribute : Attribute
            {
                public MyAttribute(int value)
                {
                }

                public string Name { get; set; }
            }
        ";

        SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(code);
        var root = syntaxTree.GetRoot();

        var visitor = new AttributeArgumentVisitor();
        visitor.Visit(root);
    }
}

在上述示例代码中,我们定义了一个AttributeArgumentVisitor类,继承自CSharpSyntaxWalker,用于遍历语法树并访问AttributeArgumentListSyntax节点。在VisitAttributeArgumentList方法中,我们遍历了属性参数列表中的每个属性参数,并通过argument.NameColon和argument.Expression获取参数的名称和类型。然后,我们可以根据需要对名称和类型进行后续处理。

请注意,示例代码中使用了Roslyn的API来获取语义信息,需要引用Microsoft.CodeAnalysis和Microsoft.CodeAnalysis.CSharp命名空间,并添加对Roslyn的引用。此外,示例代码中的代码片段是一个完整的C#程序,可以直接运行并输出结果。

对于Roslyn C#中的AttributeArgumentListSyntax获取(名称,类型)的问题,腾讯云并没有提供特定的产品或服务与之相关。

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

相关·内容

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

本文整理我和 林德熙 学习的 dotnet 编译知识、Roslyn 源码分析知识,NuGet 知识。通过阅读本文可以从零散的碎片化博客中得到从零开始学习的轨迹。...性能数据 SourceFusion 的其中一个用途是收集原本会通过反射收集的类型信息。...复制文件 - 林德熙 如何使用 MSBuild Target(Exec)中的控制台输出 - 吕毅 如何在 MSBuild Target(Exec)中报告编译错误和编译警告 - 吕毅 更高级的 Target...让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译 - 吕毅 基于 Target 的一些应用: Roslyn 如何在 Target 引用 xaml 防止文件没有编译 -...个坑 - 吕毅 Roslyn 通过 Nuget 引用源代码 在 VS 智能提示正常但是无法编译 - 林德熙 如果你的 NuGet 格式是旧的,或者说引用方式是旧的,推荐升级: 自动将 NuGet 包的引用方式从

42640

.Net 编译器平台 --- Roslyn

当程序不完整或格式错误时,语法树还会表示源代码中的错误,通过在语法树中表示被跳过或缺失的标记。 这使得语法树具有第二个属性。从解析器获取的语法树完全可逆地回到其解析的文本。...从任何语法节点,都可以获取以该节点为根的子树的文本表示。这意味着语法树可以用作构建和编辑源代码的一种方式。...在C#源文本中,标识符可能包括 Unicode 转义字符,但转义序列本身的语法不被视为标识符名称的一部分。因此,尽管标记跨越的原始文本包含转义序列,但 ValueText 属性不包含它。...尽管仅凭这些信息就足以描述源代码中的所有声明和逻辑,但它并不足以确定正在引用的内容。 例如,许多具有相同名称的类型、字段、方法和局部变量可能分散在源代码中。...符号还包含了编译器从源代码或元数据中确定的其他信息,例如其他引用的符号。每种符号类型都由从 ISymbol 派生的单独接口表示,每个接口都具有自己的方法和属性,详细描述了编译器收集的信息。

33930
  • Roslyn 如何获得一个类的引用

    本文告诉大家如何在 Rosyln 编译一个文件,获得这个文件的类的命名空间 在 C# 代码里面,大部分的代码都是在开始定义了 using 引用命名空间,本文将告诉大家如何使用 Roslyn 分析获取类文件里面引用的命名空间...在开始之前,先使用 NuGet 安装必要的库,如 Microsoft.CodeAnalysis.Compilers 库。...开发,对 C# 语言编写的文件,将会被读为语法树,但是语法树很复杂,此时就需要一个辅助的类去读取对应的逻辑。...base.VisitUsingDirective(node); } } 以上的 VisitUsingDirective 方法将会在每一次的 using 进入时被调用,也只有是作为命名空间引用的 using 才会进入 如...,进入 KeneenejajiqairCalllebolayere 文件夹 更多关于 Roslyn 请看 手把手教你写 Roslyn 修改编译 本文会经常更新,请阅读原文: https

    1.3K20

    C# 一分钟浅谈:Roslyn 编译器平台介绍

    引言 在现代软件开发中,编译器不仅仅是将源代码转换为目标代码的工具,它还承担着更多职责,如代码分析、重构建议和错误检测等。...Microsoft 的 Roslyn 编译器平台就是这样一个强大的工具,它不仅重新定义了 C# 和 VB.NET 的编译过程,还为开发者提供了丰富的 API 来操作和分析代码。...Roslyn 是 Microsoft 开发的一个开源编译器平台,用于 C# 和 VB.NET 语言。它将传统的编译过程分解为多个阶段,并为每个阶段提供了可编程的 API。...例如,如果你想修改一个方法的名称,你需要创建一个新的方法声明并替换旧的方法声明。...结论 Roslyn 编译器平台为 C# 和 VB.NET 开发者提供了强大的工具,不仅可以解析和分析代码,还可以生成和修改代码。

    32410

    .NET周刊【2月第1期 2025-02-02】

    其语法简单,能够在 C# 类型系统中实现编译器,利用 .NET 的泛型特性。示例代码展示了 C# 类型如何根据泛型参数特化,支持多种数据类型的操作。...文章强调了Roslyn编译器平台的开放性和可扩展性,并介绍了.NET 9中新增的异步API和分析器的作用。文中具体分析了如何选择正确的InvokeAsync重载,以避免异步代码出现不稳定的问题。...在 .NET 中创建网页的 PDF - Qiita https://qiita.com/omt_teruki/items/48c486c521bfa969776a 了解如何在 .NET 应用程序中创建...C# 12 中发展的集合作的基础知识和应用 https://zenn.dev/ktnd111/articles/14a0f43a7cfc15 现代书写风格的描述,如 C# 12 集合公式及其应用程序示例...在 C# 中获取 CPU 模型 - tech.guitarrapc.cóm https://tech.guitarrapc.com/entry/2025/01/28/235900 了解如何从 C# 代码中获取当前正在运行的计算机的

    3600

    .NET Roslyn快速上手指南

    Roslyn简介 Roslyn是C#和Visual Basic编译器的开源实现,具有用于构建代码分析工具的API表面。Roslyn还提供可供IDE使用的语言服务,例如重构、代码修复或编辑并继续。...Roslyn分析器 Roslyn 分析器允许您使用 Roslyn 中的数据来检查代码以检测问题。分析器可以直接在编辑器中添加错误、警告或波浪线。...,这里是一个命名类型(例如类或接口) var namedTypeSymbol = (INamedTypeSymbol)context.Symbol; // 找出名称中包含小写字母的命名类型...对应的代码如下: // 无法将表达式转换成成员、方法、属性的去掉 // 一般找都是从右往左去找 if (!...= 1) return; // 无法将表达式转换成成员、方法、属性的去掉 // 一般找都是从右往左去找 if (!

    14010

    如何从jdbc中获取数据库建表语句信息(表字段名称表字段类型表字段注释信息表字段长度等等)

    * 如何从jdbc中获取数据库建表语句信息(表字段名称/表字段类型/表字段注释信息/表字段长度等等) * 1,表字段名称 * 2,表字段类型 * 3,表字段注释信息 这里介绍3种方式,如下:...第二种方式:直接从jdbc数据库连接Connection实例中获取 三种方式获取的数据有一些区别 第一种方式不能获取到的信息比较丰富,但是唯一不能获取的是表字段备注信息,其他信息基本都有了 第二种方式可以获取完整的建表语句...中获取数据库建表语句信息(表字段名称/表字段类型/表字段注释信息/表字段长度等等) * 1,表字段名称 * 2,表字段类型 * 3,表字段注释信息 */ @Slf4j public class How2ObtainFieldInfoFromJdbc...create table user_pop_info how2ObtainFieldInfoFromJdbc.method2(); // 第二种方式:直接从jdbc数据库连接Connection实例中获取...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    4.8K10

    C#警告波预示未来将增加新的关键字

    该警告可以防止使用全部小写的类型名称(如类、结构和接口)。 创建这个警告是为了方便微软在未来添加新的关键字。...C# 的关键只包含小写 ASCII 字母,因此,加入其他任何字母都可以防止类型名称与未来的关键字发生冲突。 背    景 C# 工具链一直将其信息分为三大类:编译器错误、编译器警告和静态分析警告。...静态分析错误可能只有在特定类型的应用程序甚至是应用程序的特定部分中才算是问题。它们比编译器警告更容易产生误报,也就是不恰当的警告。与其他类型的警告不同,静态分析警告默认是不启用的。...在 Roslyn 编译器推出之前,它们是一个完全独立的工具的一部分。所以,有相当多的开发者从来没有用过它们。 历史上,微软一直不愿意增加新的编译器警告。...从 C# 9 开始,微软增加了 C# 警告波(Warning Waves)的概念。这是些附加的编译器警告,也就是说,不需要额外安装一个工具或包,它们默认是不启用的。

    31420

    苏州 开源自主的 dotnet 生态

    本文仅仅只是用来在2020苏州开发者大会上的素材,开发者大会成功完成,本文也可以公开 从编程语言版权,到编译器到运行时的开源,和允许自己分发和构建 从咱写下的 C# 代码,到在机器上运行的应用,有多少个步骤是咱可以自主的...当然了答案肯定是可以的 从 Roslyn 编译器开始,整个 Roslyn 编译器是采用 C# 编写的,依托于 dotnet 运行时运行。...从写下 Hello World 的 C# 代码到控制台打印出来,咱用到了 dotnet 里面多少的技术? 现在是 2020 年,几乎所有的高级语言都需要经过编译才能运行,咱的 C# 也不例外。...在 2020 年,其实自己基于开源的 Roslyn 定制一个属于自己的编译器没有想象中那么难,而 Roslyn 编译器的开源协议是最友好的 MIT 协议,这意味着咱可以对整个开源仓库进行自由的更改 (这将允许任何人任何组织和企业任意处置...编译器编译 C# 代码之后,如果咱不耍什么如 dotnet Native 等黑科技,那咱编译 C# 代码的输出文件将会是一个包含 IL 的 DLL 文件。

    97720

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

    本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,如何从语法分析过程,将获取的语法 Token 转换到语义分析上,比如获取类型完全限定名...可通过阅读 Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码(语法分析) - walterlv 和 使用 Roslyn 对 C# 代码进行语义分析 - walterlv 博客对此进行了解...) 决定这里一定是类型定义 使用 SemanticModel 属性从语法 ClassDeclarationSyntax 获取到语义,代码如下 var symbolInfo = generatorSyntaxContext.SemanticModel.GetDeclaredSymbol...根据 使用 Roslyn 对 C# 代码进行语义分析 - walterlv 博客的示例,可以了解到拿到 symbolInfo 对象之后,即可获取到当前语法 Program 对应的类型,约等于拿到反射的...Type 类型,即可方便获取到对应的命名空间,继承的类型,包含的成员等等 获取类型名 获取类型名的方法可以是让 symbolInfo 进行格式化输出,格式化输出可以定制输出格式,如以下代码

    79330

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

    Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性。以至于我们只需要编写很少量的代码便能够分析我们的源代码。之前我写过一些使用 Roslyn 进行语法分析的文章。...而使用语义分析,你可以像在运行时使用反射一样,在编译时访问源代码中的各种类型、属性、方法等,特别适合用来分析引用、生成代码等。当然,实际项目里面将两者结合起来可以做到更多的效果。...关于代码分析器(Analyzer)和修改器(CodeFix)可以参考我之前的这些博客: 可参考:基于 Roslyn 同时为 Visual Studio 插件和 NuGet 包开发 .NET/C# 源代码分析器...例如,拿到一个语法树(SyntaxTree)中的类型定义,可以用下面的方法: 1 2 3 4 // 遍历语法树中的所有节点,找到所有类型定义的节点。...你可以简单地获得类型的命名空间,获得类型的特性(Attribute);获得类型的成员,成员的特性…… 1 2 // 获取类型的命名空间。

    62620

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

    更新于 2018-06-02 01:26 Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性。...-- 从 netcoreapp2.0 改成 net471,因为 NuGet 包中的 ValueTuple 与 net47 不兼容,所以只能选择 net471 或以上 --> 从 Documents 集合中找出这个项目的所有文件进行分析。...在访问者模式中,由于 C# 的语法在一个 C# 版本发布之后就会确定,其中各种各样类型的语法对应访问者模式中的各种不同类型的数据,Roslyn 为我们构建的语法树对应访问者模式中需要访问的庞大的数据结构...访问泛型参数 现在,我们继续在之前打开解决方案和项目文件的代码后面增添代码: // 从我们一开始打开的项目文件中获取语法树。

    1.8K10

    【愚公系列】2023年01月 .NET CORE工具案例-CS-Script脚本执行引擎

    脚本的解决方案,有Roslyn和Mono。...CS-Script主要是基于Roslyn封装实现的,并且提供了一些额外功能: 执行完整的C#文件 通过外部进程执行C#文件 在运行过程中链接多个C#文件,并集成运行 提供简便的方法进行链接 脚本调试功能.../CodeDom三种脚本引擎,由于.NET CORE的特殊性,CS-Script.Core做了删减,只能支持Roslyn一种引擎了,支持的C#语言版本由Roslyn版本决定。...2.具体使用 2.1 CompileMethod 编译方法,并返回动态生成的程序集,方法被默认加载到DynamicClass类中,该Type完全限定名称为css_root+DynamicClass,定义的静态方法需要使用以下方式调用...; 2.3 LoadCode 加载类,并返回代码段中的第一个类的实例,通过定义返回对象为dynamic类型,可以直接调用实例方法。 //3.

    1K50

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

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

    1.4K10

    基于 Roslyn 同时为 Visual Studio 插件和 NuGet 包开发 .NETC# 源代码分析器 Analyzer 和修改器 CodeFixProvider

    本文将基于 Roslyn 开发一个 C# 代码分析器,你不止可以将分析器作为 Visual Studio 代码分析和重构插件发布,还可以作为 NuGet 包发布。...本文将教大家如何从零开始开发一个基于 Roslyn 的 C# 源代码分析器 Analyzer 和修改器 CodeFixProvider。...无论哪一种,你都可以在支持 Roslyn 分析器扩展的 IDE(如 Visual Studio)中获得如下面动图所展示的效果。...新建的项目如下: 我们目前只是基于模板创建了一个分析器,而模板中自带的分析器功能是 “只要类型名称中有任何一个字符是小写的,就给出建议将其改为全部大写”。...我在这个方法里面写的代码并不复杂,是获取原来的属性里的类型信息和属性名,然后修改文档,将新的文档返回。

    77330

    IIncrementalGenerator 增量 Source Generator 生成代码入门 判断程序集之间的 InternalsVisibleTo 关系

    本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,如何判断两个程序集之间是否存在 InternalsVisibleTo 关系...当获取到两个程序集时,如果要开始准备生成相关代码,可能会因为不知道两个程序集之间是否存在 InternalsVisibleTo 关系,也就是是否应该导出其 internal 的类型而困扰。...在能够获取到 IAssemblySymbol 类型的对象,即可通过 GivesAccessTo 方法判断两个程序集的 InternalsVisibleTo 关系 这个 GivesAccessTo 方法可以获取到当前的程序集对给定的程序集参数是否为...EnforceExtendedAnalyzerRules 属性的作用 以上的 LangVersion 属性设置为 latest 表示使用最新的语言版本,详细请参阅 VisualStudio 使用三个方法启动最新 C#...= compilation.SourceModule.ReferencedAssemblySymbols; ... // 忽略代码 }); } } 从

    27620

    .NET周刊【9月第2期 2024-09-08】

    国内文章 WPF 从裸 Win 32 的 WM_Pointer 消息获取触摸点绘制笔迹 https://www.cnblogs.com/lindexi/p/18390983 本文将告诉大家如何在 WPF...里面,接收裸 Win 32 的 WM_Pointer 消息,从消息里面获取触摸点信息,使用触摸点信息绘制简单的笔迹。...,在 WPF 底层是如何从 Win32 的消息循环获取到的 WM_POINTER 消息处理转换作为 Touch 事件的参数。...C#自定义控件—指示灯 https://www.cnblogs.com/guoenshuo/p/18397557 本文介绍了如何在C#中利用GDI绘制指示灯控件。...C#自定义控件—流动管道 https://www.cnblogs.com/guoenshuo/p/18391637 这篇文章介绍了如何在C#中绘制一个动态流动管道,包括管道的渐变色矩形和半圆的绘制,以及流动条的绘制方法

    8310
    领券