将 [ApiController] 属性添加到 class

Add [ApiController] Attribute to the class

我已经实现了将Asp.Net WebApi 迁移到Asp.Net Core 3 的项目。1.I 已经开始学习Rosyln 解析器。使用 Rosyln,我必须将“ApiController”属性 更改为 class 名称中的属性。

Sample.cs

namespace TestFile.TestData.Target
{   
  public class SampleFile: ApiController
  {        
  }
}

进入

namespace TestFile.TestData.Target
{   
  [ApiController]
  public class SampleFile: ControllerBase
  {        
  }
}

我关注了link: Adding custom attributes to C# classes using Roslyn。但是没看懂

请就如何使用 Roslyn 提出替代解决方案建议。

你想达到什么目的?您已成功添加 [ApiController] 没有更多额外的步骤。 link 是关于通过源代码生成器(编写代码的代码)添加属性,如果您只是想添加属性,则不需要源代码生成器。

顺便说一句,Roslyn 是 c# 编译器的名称。 Wich 用于创建整个应用程序,而不是用于向 class :)

添加属性的工具

如果您尝试通过源代码生成器生成 class,可以稍微编辑一下问题

终于明白了,

Sample.cs:

private void AddCustomClassAttribute(string TargetClassFile, string CustomAttributeName)
{    
    var code = File.ReadAllText(TargetClassFile);
    var updateClassFile = InsertClassAttribute(code, CustomAttributeName).GetAwaiter().GetResult();
    if (!string.IsNullOrEmpty(updateClassFile))
        File.WriteAllText(TargetClassFile, updateClassFile);           
}

private async Task<string> InsertClassAttribute(string Code, string CustomAttributeName)
{
    // Parse the code into a SyntaxTree.
    var tree = CSharpSyntaxTree.ParseText(Code);
    // Get the root CompilationUnitSyntax.
    var root = await tree.GetRootAsync().ConfigureAwait(false) as CompilationUnitSyntax;    
    var findNamespace = root.Members.Single(m => m is NamespaceDeclarationSyntax) as NamespaceDeclarationSyntax;
    // Get all class declarations inside the namespace.
    var classDeclarations = findNamespace.Members.Where(m => m is ClassDeclarationSyntax);
    // find the main class from the findNameSapce
    var findRootClass = classDeclarations.First() as ClassDeclarationSyntax;
    var addCustomAttribute = AttributeList(
                                SingletonSeparatedList(
                                    Attribute(IdentifierName(CustomAttributeName)))
                                ).NormalizeWhitespace();

    // To check whether specific attribute is present in the class or not then only insert given attribute
    if (findRootClass.BaseList?.Types.ToFullString().Trim() == CustomAttributeName)
    {
        var attributes = findRootClass.AttributeLists.Add(addCustomAttribute);
        root = root.ReplaceNode(
            findRootClass,
            findRootClass.WithAttributeLists(attributes)).NormalizeWhitespace();
        return root.ToFullString();
    }
    return null;            
}