2014-02-11 28 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

而且它不会破坏文件的结构?例如,我在文件中有两个类,我只有一个......然后我需要创建一个新的树,给定第二个类,然后将树保存在一个文件中,确保删除旧的文件? – Imorian

+0

或者我可以简单地更换树木吗? – Imorian

+0

它不会中断文件。如果您想要更新类的文件_copy_,您可以使用root.ReplaceNode来获取您的更改。 –

相关问题