Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Roslyn中的方法符号生成方法签名的语法_C#_.net_Roslyn - Fatal编程技术网

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

C# 从Roslyn中的方法符号生成方法签名的语法,c#,.net,roslyn,C#,.net,Roslyn,我正在尝试使用Roslyn(第一次用户)生成代码。我觉得它太冗长了,我只能假设我做错了什么。目前,我正在为给定的IMethodSymbol(来自接口)生成一个方法的实现: 私有静态MethodDeclarationSyntax GetMethodDeclarationSyntax(IMethodSymbol methodSymbol) { if(methodSymbol.MethodKind!=MethodKind.normal) { 返回null; } var参数=methodSymbol .

我正在尝试使用Roslyn(第一次用户)生成代码。我觉得它太冗长了,我只能假设我做错了什么。目前,我正在为给定的
IMethodSymbol
(来自接口)生成一个方法的实现:

私有静态MethodDeclarationSyntax GetMethodDeclarationSyntax(IMethodSymbol methodSymbol)
{
if(methodSymbol.MethodKind!=MethodKind.normal)
{
返回null;
}
var参数=methodSymbol
.参数
.选择(x=>SF
.参数(SF.标识符(x.名称))
.WithType(SF.IdentifierName(x.Type.ToDisplayString(symboldDisplayFormat)));
返回SF
.方法声明(
SF.IdentifierName(methodSymbol.ReturnType.ToDisplayString(symbolDisplayFormat)),
SF.标识符(methodSymbol.Name))
.带修饰语(
SF.TokenList(
SF.Token(SyntaxKind.PublicKeyword)))
.WithParameterList(
参数表(
SF.分离列表(参数));
}
它已经相当强大了,我还没有考虑到实际的实现,通用参数,
ref
/
out
参数等等


有没有更简单的方法来实现这一点?

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

鉴于此,我得出了以下结论:

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

注意,我们必须手动从方法符号中删除
抽象
修饰符(因为它起源于接口,本质上是
抽象
)。我还在删除
摘要
修饰符后添加语句,否则它们将被忽略。

谢谢Kevin-我将看一看
语法生成器
。你介意也看看这个问题吗?嗯,我真的不知道如何在我当前的设计中使用
SyntaxGenerator
,因为我已经将工作区创建与代码生成分离了。代码生成块不再具有用于创建语法生成器的
文档
工作区
。很可能我做错了™嗯,
工作区
层是像这样的有用服务的所在。编译器级API旨在成为原始构建块,因此可以按照您现在的方式进行,但您要求的是一种更简单的方法-更简单的方法是在更高的抽象层。是的,我重构了代码,以便可以使用
SyntaxGenerator
。这无疑使codegen的逻辑简单了一点。
var methodDeclaration = syntaxGenerator.MethodDeclaration(methodSymbol);
methodDeclaration = syntaxGenerator
    .WithModifiers(
        methodDeclaration,
        syntaxGenerator
            .GetModifiers(methodDeclaration)
            .WithIsAbstract(false));
methodDeclaration = syntaxGenerator
    .WithStatements(
        methodDeclaration,
        GetMethodStatementsSyntax(syntaxGenerator, semanticModel, methodSymbol));