如何使用 CodeGenerator 实现接口的所有成员

Posted

技术标签:

【中文标题】如何使用 CodeGenerator 实现接口的所有成员【英文标题】:How to implement all members of an interface using CodeGenerator 【发布时间】:2021-09-03 03:58:15 【问题描述】:

我正在创建一个 Visual Studio 扩展,在其中执行某些命令时,应该生成一个 .cs 文件,其中包含一个实现接口的类,并且所有成员也应该自动实现。

例子:

假设我有以下界面,

interface IFile

    void ReadFile();
    void WriteFile(string text);

我想生成以下代码:

using System;

namespace TestProject

    public class FileInfo : IFile
    
        public void ReadFile()
        
            
        

        public void WriteFile(string text)
        
            
        
    

但我只能生成以下内容:

using System;

namespace TestProject

    public class FileInfo : IFile
    
    

生成上述代码的代码如下:

AdhocWorkspace adhocWorkspace = new AdhocWorkspace();
var syntaxGenerator = SyntaxGenerator.GetGenerator(adhocWorkspace, LanguageNames.CSharp);

var usingSystem = syntaxGenerator.NamespaceImportDeclaration("System");

var interfaceNode = new List<SyntaxNode>()  SyntaxFactory.ParseTypeName("IFile") ;

var classDeclaration = syntaxGenerator.ClassDeclaration("FileInfo",
    null,
    Accessibility.Public,
    DeclarationModifiers.None,
    null,
    interfaceNode,
    null
    );

var namespaceDeclaration = syntaxGenerator.NamespaceDeclaration("TestProject", classDeclaration);

var generatedCode = syntaxGenerator.CompilationUnit(usingSystem, namespaceDeclaration)
    .NormalizeWhitespace().ToFullString();

如何使用 CodeGenerator 实现所有成员? 或者是否有我可以使用的命令,例如格式化文档的命令,如下所示

dte.ExecuteCommand("Edit.FormatDocument", string.Empty);

【问题讨论】:

【参考方案1】:

你可以使用SyntaxGenerator.MethodDeclaration Method,就像:

var cloneMethoDeclaration = generator.MethodDeclaration("ReadFile", 
    null, 
    null, 
    null, 
    Accessibility.Public, 
    DeclarationModifiers.None, 
    null);

我也找到了a sample from github,希望对你有帮助。

【讨论】:

这是手动方法。手动生成接口的所有成员。 如果你想自动实现一个接口,也许你可以创建一个sn-p或者通过vs扩展修改现有的sn-p文件。

以上是关于如何使用 CodeGenerator 实现接口的所有成员的主要内容,如果未能解决你的问题,请参考以下文章

Intellij-安装CodeGenerator插件并且添加Builder模板

找不到与命令“dotnet-aspnet-codegenerator”匹配的可执行文件”

aspnet-codegenerator:没有可用的代码生成器,即使添加了 Microsoft.VisualStudio.Web.CodeGeneration.Design

Android Studio插件之快速findViewById(butterknife和Android CodeGenerator的使用)

dotnet 工具 aspnet-codegenerator 在错误的路径中查找可执行文件

1024 CodeGenerator