2014-02-11 1 views
7

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

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); 

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

ответ

7

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

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

Это то, над чем мы работаем над тем, чтобы яснее в именах методов.

+0

И как это не нарушает структуру файла? Например, у меня есть 2 класса в файле, и у меня есть только один ... тогда мне нужно создать новое дерево, учитывая второй класс, а затем сохранить дерево в fie cs, гарантируя удаление старого файл? – Imorian

+0

Или я могу просто заменить деревья? – Imorian

+0

Это не разрушает файл. Если вы хотите _copy_ файла с обновленным классом, вы можете использовать root.ReplaceNode, чтобы получить его с вашими изменениями. –