c#roslyn生成基类类型的类

c#roslyn生成基类类型的类,c#,roslyn,base-class,C#,Roslyn,Base Class,我从以下来源获得,它使用Roslyn生成类: // Get a workspace var workspace = new AdhocWorkspace(); // Get the SyntaxGenerator for the specified language var generator = SyntaxGenerator.GetGenerator(workspace, LanguageNames.CSharp); // Create using

我从以下来源获得,它使用Roslyn生成类:

    // Get a workspace
    var workspace = new AdhocWorkspace();

    // Get the SyntaxGenerator for the specified language
    var generator = SyntaxGenerator.GetGenerator(workspace, LanguageNames.CSharp);

    // Create using/Imports directives
    var usingDirectives = generator.NamespaceImportDeclaration("System");

    // Generate two private fields
    var lastNameField = generator.FieldDeclaration("_lastName",
      generator.TypeExpression(SpecialType.System_String),
      Accessibility.Private);
    var firstNameField = generator.FieldDeclaration("_firstName",
      generator.TypeExpression(SpecialType.System_String),
      Accessibility.Private);

    // Generate two properties with explicit get/set
    var lastNameProperty = generator.PropertyDeclaration("LastName",
      generator.TypeExpression(SpecialType.System_String), Accessibility.Public,
      getAccessorStatements: new SyntaxNode[]
      { generator.ReturnStatement(generator.IdentifierName("_lastName")) },
      setAccessorStatements: new SyntaxNode[]
      { generator.AssignmentStatement(generator.IdentifierName("_lastName"),
    generator.IdentifierName("value"))});
    var firstNameProperty = generator.PropertyDeclaration("FirstName",
      generator.TypeExpression(SpecialType.System_String),
      Accessibility.Public,
      getAccessorStatements: new SyntaxNode[]
      { generator.ReturnStatement(generator.IdentifierName("_firstName")) },
      setAccessorStatements: new SyntaxNode[]
      { generator.AssignmentStatement(generator.IdentifierName("_firstName"),
      generator.IdentifierName("value")) });

    // Generate parameters for the class' constructor
    var constructorParameters = new SyntaxNode[] {
      generator.ParameterDeclaration("LastName",
      generator.TypeExpression(SpecialType.System_String)),
      generator.ParameterDeclaration("FirstName",
      generator.TypeExpression(SpecialType.System_String)) };

    // Generate the constructor's method body
    var constructorBody = new SyntaxNode[] {
      generator.AssignmentStatement(generator.IdentifierName("_lastName"),
      generator.IdentifierName("LastName")),
      generator.AssignmentStatement(generator.IdentifierName("_firstName"),
      generator.IdentifierName("FirstName"))};


    // Generate the class' constructor
    var constructor = generator.ConstructorDeclaration("Person",
      constructorParameters, Accessibility.Public,
      statements: constructorBody);

    // An array of SyntaxNode as the class members
    var members = new SyntaxNode[] { lastNameField,
    firstNameField, lastNameProperty, firstNameProperty,
    constructor };

    // Generate the class
    var classDefinition = generator.ClassDeclaration(
      "Person", typeParameters: null,
      accessibility: Accessibility.Public,
      modifiers: DeclarationModifiers.Abstract,
      baseType: null,
      members: members);

    generator.AddBaseType(classDefinition, generator.IdentifierName("PersonBase"));

    // Declare a namespace
    var namespaceDeclaration = generator.NamespaceDeclaration("MyTypes", classDefinition);

    // Get a CompilationUnit (code file) for the generated code
    var newNode = generator.CompilationUnit(usingDirectives, namespaceDeclaration).
      NormalizeWhitespace();


    StringBuilder sb = new StringBuilder();
    using (StringWriter writer = new StringWriter(sb))
    {
        newNode.WriteTo(writer);
        Console.Write(writer.ToString());
    };
一切正常。现在,我需要使用名为“PersonBase”的基类生成Person类

我尝试使用下面的代码段,但并没有产生预期的结果:

generator.AddBaseType(classDefinition, generator.IdentifierName("PersonBase"));
我做错什么了吗

我们将非常感谢您的帮助

谢谢。

找到了解决方案

这似乎与Roslyn对象的不变性质有关:

    var baseNode = generator.IdentifierName("PersonBase");

    // Generate the class
    var classDefinition = generator.ClassDeclaration(
      "Person", typeParameters: null,
      accessibility: Accessibility.Public,
      modifiers: DeclarationModifiers.Abstract,
      baseType: baseNode,
      members: members);

谢谢。

ClassDeclaration
中有一个
baseType
参数,为什么不使用它呢?是的,Rafal。它就在那里。我试过了。然而,忘记Roslyn的不变本质,所以尝试了那个种方法。谢谢