我正在尝试使用Roslyn编写代码转换,将接口方法的返回类型从T
更改为Task<T>
(假设没有返回void)。以下是我提出的代码。
CODE
InterfaceDeclarationSyntax asyncInterface = syncInterface.ReplaceNodes(
syncInterface.Members.OfType<MethodDeclarationSyntax>(),
(a, m) => m.ReplaceNode(
m.ReturnType,
SF.GenericName(SF.Identifier("Task"), SF.TypeArgumentList(new SeparatedSyntaxList<TypeSyntax>().Add(m.ReturnType)))));
首先这是正确的方法吗?
其次这会在格式化时弄乱缩进。我该如何解决这个问题?
修改
我能够通过保留Trivia来解决第二个问题。这是更新的代码(我也将其迁移到使用重写器)。
代码
sealed class AsyncMethodRewriter : CSharpSyntaxRewriter
{
public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax m)
{
var newReturnType = SF.GenericName(SF.Identifier("Task"), SF.TypeArgumentList(new SeparatedSyntaxList<TypeSyntax>().Add(m.ReturnType.WithoutTrivia())));
newReturnType = newReturnType.InsertTriviaBefore(newReturnType.GetLeadingTrivia().First(), m.ReturnType.GetLeadingTrivia().AsEnumerable());
newReturnType = newReturnType.InsertTriviaAfter(newReturnType.GetTrailingTrivia().First(), m.ReturnType.GetTrailingTrivia().AsEnumerable());
return m.ReplaceNode(m.ReturnType, newReturnType);
}
}
答案 0 :(得分:2)
WithReturnType
MethodDeclarationSyntax
方法和AddTypeArgumentListArguments
类<{1}}方法来简化代码
GenericNameSyntax
方法处理格式前导和尾随trivias 试试这段代码:
NormalizeWhitespace()