如何将 IMethodSymbol 转换为 MethodDeclarationSyntax?

How to convert an IMethodSymbol to a MethodDeclarationSyntax?

给定一个 IMethodSymbol 我如何创建一个 MethodDeclarationSyntax

背景:

为了修复代码,我将方法从一个实现接口的 class 复制到另一个实现不同接口的方法。

因此,我需要对复制的方法进行一些修改(参数、命名空间等)。 我想修改 IMethodSymbol,将符号转换为 MethodDeclarationSyntax,然后将符号添加到新的 class。

我已经能够通过使用 DeclaringSyntaxReferences 属性 来做到这一点,但是当原始 class 驻留在 nuget 包中时,这不起作用。

使用 DeclaringSyntaxReferences(以及我自己的一些代码)我能够执行以下操作:

public static MethodDeclarationSyntax[] ToMethodDeclarationSyntax(this IMethodSymbol methodSymbol)
        {
            var namespaceValue = methodSymbol.ContainingNamespace.GetNameSpaceIdentifier();
            var syntaxReference = methodSymbol.DeclaringSyntaxReferences;
            var syntaxNodes = syntaxReference.Select(syntaxRef => syntaxRef.GetSyntax());
            var methodNodes = syntaxNodes.OfType<MethodDeclarationSyntax>();
            var methodExpression = methodSymbol.CreateExpressionSyntax();
            return methodNodes
                .Select(mds => mds
                    .WithExpressionBody(methodExpression)
                    .WithReturnType(SyntaxFactory.QualifiedName(namespaceValue, SyntaxFactory.IdentifierName(mds.ReturnType.ToString())))
                    .WithParameterList(methodSymbol.GetFullyQualifiedParameterListSyntax())
                )
                .ToArray();
        }

有没有办法在不使用 DeclaringSyntaxReferences 的情况下从 IMethodSymbol 生成 MethodDeclarationSyntax?

谢谢!

使用带有 IMethodSymbol 的 SyntaxGenerator.MethodDeclaration。您可能根本不想使用 DeclaringSyntaxReferences,因为它仅在您的符号直接来自源代码的情况下才真正有用。