2
.NET 컴파일러 플랫폼 (roslyn)을 사용하여 코드 리팩터링을 구현하려고합니다. 그러나 어떤 이유로 ArgumentList와 함께 ObjectCreationExpression을 사용할 수 없습니다. 여기 내 방법 (전체 코드는 here를 찾을 수 있습니다)입니다 :CodeRefactoringProvider 안에 ArgumentList가있는 ObjectCreationExpression
private aync Task<Document> AddGuardAsync(Document document, ParameterSyntax parameter, BaseMethodDeclarationSyntax methodDeclaration, CancellationToken cancellationToken)
{
BinaryExpressionSyntax binaryExpression = SyntaxFactory.BinaryExpression(SyntaxKind.EqualsExpression,
SyntaxFactory.IdentifierName(parameter.Identifier),
SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression));
NameOfExpressionSyntax nameOfExp = SyntaxFactory.NameOfExpression(
"nameof",
SyntaxFactory.ParseTypeName(parameter.Identifier.Text));
SeparatedSyntaxList<ArgumentSyntax> argsList = new SeparatedSyntaxList<ArgumentSyntax>();
argsList.Add(SyntaxFactory.Argument(nameOfExp));
ObjectCreationExpressionSyntax objectCreationEx = SyntaxFactory.ObjectCreationExpression(
SyntaxFactory.ParseTypeName(nameof(ArgumentNullException)),
SyntaxFactory.ArgumentList(argsList),
null);
ThrowStatementSyntax throwStatement = SyntaxFactory.ThrowStatement(objectCreationEx);
IfStatementSyntax ifStatement = SyntaxFactory
.IfStatement(SyntaxFactory.Token(SyntaxKind.IfKeyword), SyntaxFactory.Token(SyntaxKind.OpenParenToken), binaryExpression, SyntaxFactory.Token(SyntaxKind.CloseParenToken), throwStatement, null)
.WithAdditionalAnnotations(Formatter.Annotation);
SyntaxNode root = await document.GetSyntaxRootAsync(cancellationToken);
SyntaxNode newRoot = root.InsertNodesBefore(methodDeclaration.Body.ChildNodes().First(), new[] { ifStatement });
return document.WithSyntaxRoot(newRoot);
}
이 이상하게 nameof
인수없이 다음 코드의 수정 제안을 생산하는 (심지어 중괄호없이)
무엇 내가 여기에없는거야?
아를 원하는, 감사합니다! 내가 왜 if 문에 중괄호를주지 않는지도 알고 있습니까? – tugberk
중괄호가 필요한 경우 구문을 SyntaxFactory.BlockStatement로 묶습니다. –