gpt4 book ai didi

code-generation - Roslyn 的 SyntaxReceiver - 获取实现接口(interface)的类

转载 作者:行者123 更新时间:2023-12-05 02:41:39 25 4
gpt4 key购买 nike

我正在尝试开发一个源代码生成器,以使用该接口(interface)在部分类上自动实现一个接口(interface)。

我相信这一定是 Microsoft's new Source Generators 的常见用例,甚至在 Roslyn Source Generator Cookbook 中被列为用例,但没有示例实现。

我进行了搜索,但一直难以在 Roslyn 分析器中找到针对此场景的问题。

在说明书中,他们使用 SyntaxReceiver 类来过滤 Execute 调用应处理哪些语法节点:

        class SluggableSyntaxReceiver : ISyntaxReceiver
{
public List<ClassDeclarationSyntax> ClassesToAugment { get; } = new List<ClassDeclarationSyntax>();

public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
{
// Business logic to decide what we're interested in goes here
if(syntaxNode is ClassDeclarationSyntax cds && cds.HasInterface("IChangeTracked"))
ClassesToAugment.Add(cds)
}

}

查看说明书以了解生成器的实现细节。

我要确定的是如何在 ClassDeclarationSyntax 节点上实现我的 HasInterface 扩展。

        public static bool HasInterface(this ClassDeclarationSyntax source, string interfaceName)
{
IEnumerable<TypeSyntax> baseTypes = source.BaseList.Types.Select(baseType=>baseType.Type);
// Ideally some call to do something like...
return baseTypes.Any(baseType=>baseType.Name==interfaceName);
}

我如何:

  1. 从 ClassDeclarationSyntax 中获取 BaseList 属性,
  2. 判断类是否是部分类
  3. 访问接口(interface)
  4. 确定是否有任何接口(interface)属于特定类型。

最佳答案

我必须相信有比我所做的更好的方法来做到这一点,但就其值(value)而言,这是一个工作实现,它确定特定的 ClassDeclarationSyntax 是否显式实现了一个接口(interface):

        /// <summary>Indicates whether or not the class has a specific interface.</summary>
/// <returns>Whether or not the SyntaxList contains the attribute.</returns>
public static bool HasInterface(this ClassDeclarationSyntax source, string interfaceName)
{
IEnumerable<BaseTypeSyntax> baseTypes = source.BaseList.Types.Select(baseType => baseType);

// To Do - cleaner interface finding.
return baseTypes.Any(baseType => baseType.ToString() ==interfaceName);
}

关于code-generation - Roslyn 的 SyntaxReceiver - 获取实现接口(interface)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68020004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com