首页
学习
活动
专区
工具
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 包的引用方式

26240

.Net 编译器平台 --- Roslyn

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

26030

Roslyn 如何获得一个类的引用

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

1.2K20

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

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

29920

苏州 开源自主的 dotnet 生态

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

96420

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

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

69330

如何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.6K10

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

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

38120

【愚公系列】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.

80950

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

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

1.7K10

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

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

45020

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

.NET周刊【8月第1期 2023-08-06】

TimerQueue是如何在删除数据时维持B树的平衡性的,包括叶子节点和非叶子节点删除数据,以及提前扩充只有t-1个Item的节点的三种方法:左兄弟节点借用Item,右兄弟节点借用Item,与左兄弟节点或右兄弟节点合并...作者展示了如何使用他的库Sdcb.LibRaw来将RAW照片转换为Bitmap或者其他格式的图像,以及如何获取支持的相机列表。...如何在代码添加XML注释,以便在Swagger UI显示更多的信息和说明。 如何自定义Swagger UI的样式和主题,以及如何添加授权功能。...该扩展基于 C# 开发套件构建,支持代码编辑的 AI 辅助、Roslyn 分析器和 Unity 的游戏调试等功能。文章还介绍了如何在Unity中使用。...-1824 如何在 ASP.NET Core 应用程序实现插件架构。

17510

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

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

23420

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

即便如此复杂的 C# 语法,建立的复杂的 C# 语法树,还有其复杂的树遍历和修改过程,也都被其 API 包装得干净简洁。 而这背后是它的重要设计思路 —— 红绿树。...获取红树的源代码 源代码摘抄自:roslyn/SyntaxNode.cs at master · dotnet/roslyn。...Roslyn 的设计理念 Roslyn 一开始就将漂亮的 API 作为目标的一部分,同时还要非常高的性能;所以 Roslyn 的开发团队需要找到一种特殊的数据结构来描述语言( C#)的语法。...Roslyn 的设计中有一个重要的业务需求,希望能够分析源代码文件并在开发者编辑的过程不断提供建议。也就是说,当我们连续不断地去修改源代码的文本内容时,Roslyn 也需要具备很高的性能。...所以,在 Roslyn 的设计,希望源代码文本改变时,整棵树的大多数节点都是能够重复使用的(无需重新生成)。 而如果将数据结构设计成不可变的(Immutable),那么重用这些节点将会非常容易。

1K10

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

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

1.3K80
领券