簡體   English   中英

Roslyn - 將擴展方法調用重寫為完全限定格式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM