将 [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;
}
我已经实现了将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;
}