[英]Roslyn - Rewrite extension method invocation to full qualified format
如何將擴展方法的調用重寫為完全限定格式,不再需要使用?
例如。
list.OrderBy(x => x.Prop)
應該成為
System.Collections.Generic.Enumerable.OrderBy(list, x => x.Prop)
回答我自己的問題。 我在CSharpSyntaxRewriter對象中使用它。 如果有人也可以看看這個會很好。
public override SyntaxNode VisitInvocationExpression(InvocationExpressionSyntax node)
{
var methodInfo = _model.GetSymbolInfo(node).Symbol as IMethodSymbol;
if (methodInfo != null)
{
var containingType = methodInfo.ContainingType;
if (methodInfo.IsExtensionMethod)
{
// extension method
var exp = node.Expression as MemberAccessExpressionSyntax;
if (exp != null)
{
// new arguments
var newArguments = SyntaxFactory.ArgumentList();
newArguments = newArguments.AddArguments(SyntaxFactory.Argument(exp.Expression));
newArguments = newArguments.AddArguments(node.ArgumentList.Arguments.ToArray());
// new expression
var stack = new Stack<SimpleNameSyntax>();
stack.Push(exp.Name);
stack.Push(SyntaxFactory.IdentifierName(containingType.Name));
for (var s = containingType.ContainingNamespace; s != null; s = s.ContainingNamespace)
{
if (!s.IsGlobalNamespace && s.Name != "")
stack.Push(SyntaxFactory.IdentifierName(s.Name));
}
// build and return
if (stack.Count >= 2)
{
var newExp = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, stack.Pop(), stack.Pop());
while (stack.Any())
newExp = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, newExp, stack.Pop());
return node.WithExpression(newExp).WithArgumentList(newArguments);
}
}
}
}
return base.VisitInvocationExpression(node);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.