Не удается добавить члена в класс программно с помощью Roslyn

Я пытаюсь добавить метод к классу с помощью Roslyn.
Я анализирую файл .cs и получаю определенный класс.

SyntaxTree tree = SyntaxTree.ParseFile(Path);
CompilationUnitSyntax root = (CompilationUnitSyntax)tree.GetRoot();
MemberDeclarationSyntax firstMember = root.Members[0];
TypeDeclarationSyntax lClassDeclarationSyntax = (TypeDeclarationSyntax)NamespaceDeclaration.Members[1];

Затем я создаю экземпляр типа MemberDeclaration

MethodDeclarationSyntax lMethodDeclarationSyntax= Syntax.MethodDeclaration(
Syntax.List<AttributeListSyntax>(),
Syntax.TokenList(),
Syntax.IdentifierName("MemoryStream"),
null,
Syntax.Identifier("Serialize"),
null,
Syntax.ParameterList(),
Syntax.List<TypeParameterConstraintClauseSyntax>(),
Syntax.Block(lList));

где lList - это тело метода. Затем я пытаюсь добавить этот экземпляр в класс

lClassDeclarationSyntax.Members.Add(lMethodDeclarationSyntax);

но ничего в ответ. Как я могу это сделать?


person Imorian    schedule 11.02.2014    source источник


Ответы (1)


Деревья синтаксиса Roslyn неизменяемы, поэтому метод Add возвращает новый SyntaxList, а не обновляет его на месте. Вы, наверное, хотите что-то вроде

var newClass = lClassDeclarationSyntax
.WithMembers(lClassDeclarationSyntax.Members.Add(lMethodDeclarationSyntax));

Мы работаем над тем, чтобы сделать имена методов более понятными.

person Kevin Pilch    schedule 11.02.2014
comment
И как это не нарушает структуру файла? Например, у меня есть 2 класса в файле, и у меня есть только один ... тогда мне нужно создать новое дерево с учетом второго класса, а затем сохранить дерево в файле cs, гарантируя удаление старого файл? - person Imorian; 11.02.2014
comment
Или я могу просто заменить деревья? - person Imorian; 11.02.2014
comment
Это не нарушает работу файла. Если вам нужна копия файла с обновленным классом, вы можете использовать root.ReplaceNode, чтобы получить его с вашими изменениями. - person Kevin Pilch; 12.02.2014
comment
Также есть ClassDeclarations.AddMembers, чтобы добавить участников позже. Вероятно, что после вашего ответа был введен api. - person Pretasoc; 10.04.2019