我尝试使用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
参数等。
有没有更简单的方法来实现这个目标?
答案 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
修饰符之后添加语句,否则它们会被忽略。