【问题标题】:How to implement all members of an interface using CodeGenerator如何使用 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);

【问题讨论】:

    标签: c# visual-studio code-generation roslyn visual-studio-extensions


    【解决方案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文件。
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多