【问题标题】:How to convert an IMethodSymbol to a MethodDeclarationSyntax?如何将 IMethodSymbol 转换为 MethodDeclarationSyntax?
【发布时间】:2020-09-11 20:27:55
【问题描述】:

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

背景:

对于代码修复,我将一个实现接口的类中的方法复制到另一个实现不同接口的类中。

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

我已经能够通过使用 DeclaringSyntaxReferences 属性来做到这一点,但是当原始类驻留在 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?

谢谢!

【问题讨论】:

    标签: c# roslyn roslyn-code-analysis codefixprovider


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 2010-09-08
      • 2013-09-21
      • 2011-05-14
      • 1970-01-01
      相关资源
      最近更新 更多