从Roslyn中的方法符号生成方法签名的语法

时间:2015-03-25 22:44:12

标签: c# .net roslyn

我尝试使用Roslyn(第一次使用者)生成代码。我发现它如此冗长以至于我只能假设我做错了什么。目前,我正在为给定的IMethodSymbol生成方法的实现(来自接口):

private static MethodDeclarationSyntax GetMethodDeclarationSyntax(IMethodSymbol methodSymbol)
{
    if (methodSymbol.MethodKind != MethodKind.Ordinary)
    {
        return null;
    }

    var parameters = methodSymbol
        .Parameters
        .Select(x => SF
            .Parameter(SF.Identifier(x.Name))
            .WithType(SF.IdentifierName(x.Type.ToDisplayString(symbolDisplayFormat))));

    return SF
        .MethodDeclaration(
            SF.IdentifierName(methodSymbol.ReturnType.ToDisplayString(symbolDisplayFormat)),
            SF.Identifier(methodSymbol.Name))
        .WithModifiers(
            SF.TokenList(
                SF.Token(SyntaxKind.PublicKeyword)))
        .WithParameterList(
            SF.ParameterList(
                SF.SeparatedList<ParameterSyntax>(parameters)));
}

它已经非常沉重,我还没有考虑实际的实现,通用参数,ref / out参数等。

有没有更简单的方法来实现这个目标?

2 个答案:

答案 0 :(得分:1)

从VS 2015 CTP 6和Roslyn 1.0-rc1 NuGet软件包开始,请查看SyntaxGenerator class

答案 1 :(得分:0)

鉴于Kevin's answer,这就是我所得到的:

var methodDeclaration = syntaxGenerator.MethodDeclaration(methodSymbol);
methodDeclaration = syntaxGenerator
    .WithModifiers(
        methodDeclaration,
        syntaxGenerator
            .GetModifiers(methodDeclaration)
            .WithIsAbstract(false));
methodDeclaration = syntaxGenerator
    .WithStatements(
        methodDeclaration,
        GetMethodStatementsSyntax(syntaxGenerator, semanticModel, methodSymbol));

请注意,我们必须从方法符号中手动删除abstract修饰符(因为它源自一个接口,它本质上是abstract)。我还在删除abstract修饰符之后添加语句,否则它们会被忽略。