首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过NameOf ( SyntaxFactory )构造SyntaxFactory表达式

通过NameOf ( SyntaxFactory )构造SyntaxFactory表达式
EN

Stack Overflow用户
提问于 2017-09-16 22:35:23
回答 1查看 612关注 0票数 6

尝试使用nameof SyntaxFactory从头构造C#表达式。Roslyn未能将我的InvocationExpressionSyntax识别为上下文nameof关键字,并向Emit命令抛出错误诊断。

尝试给Roslyn有效的代码进行解析,希望我能找到语法构造和“正确解析的代码”之间的区别。我能够将差异跟踪到"nameof“标识符,但这正是我陷入困境的地方。我无法在我的nameof令牌和解析的令牌之间找到任何区别,但它们仍然是不同的。

当我使用“已解析的一”时,一切正常,Emit按预期工作,没有错误。另一方面,当我使用自己的nameof令牌时,它无法编译,Emit会抛出错误诊断。

我在下面测试的代码:

代码语言:javascript
运行
复制
var CODE = "class X { void Q() { var q = nameof(Q); } }";

var correctSyntaxTree = CSharpSyntaxTree.ParseText(CODE);
var correctRoot = correctSyntaxTree.GetRoot();
var correctNameOf = correctRoot.DescendantNodes().OfType<InvocationExpressionSyntax>().First();

var correctExpression = (IdentifierNameSyntax)correctNameOf.Expression;

var myNameOf = SyntaxFactory.InvocationExpression (
    correctExpression, //Works
    //SyntaxFactory.IdentifierName("nameof"), //Doesn't work
    //SyntaxFactory.IdentifierName(SyntaxFactory.Token(SyntaxKind.NameOfKeyword)), //System.ArgumentException: 'identifier'

    //SyntaxFactory.IdentifierName(correctExpression.Identifier), //Works
    //SyntaxFactory.IdentifierName(correctExpression.Identifier.ValueText), //Doesn't work

    //correctExpression.WithIdentifier(SyntaxFactory.Identifier("nameof")), //Doesn't work
    //correctExpression.WithIdentifier(SyntaxFactory.Identifier(correctExpression.Identifier.ValueText)), //Doesn't work

    //SyntaxFactory.IdentifierName("nameof").WithTriviaFrom(correctExpression), //Doesn't work
    //correctExpression.CopyAnnotationsTo(SyntaxFactory.IdentifierName("nameof")), //Doesn't work
    //SyntaxFactory.IdentifierName(correctExpression.Identifier.WithoutAnnotations().WithoutTrivia()), //Works

    SyntaxFactory.ArgumentList (
        SyntaxFactory.SingletonSeparatedList (
            SyntaxFactory.Argument (
                SyntaxFactory.IdentifierName("Q")
            )
        )
    )
);

var newRoot = correctRoot.ReplaceNode(correctNameOf, myNameOf);
var newTree = CSharpSyntaxTree.Create((CSharpSyntaxNode)newRoot);

var compilation = CSharpCompilation.Create (
    "Compilation",
    new[] { newTree },
    references: MsCorLib,
    options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
);

var compilationResult = compilation.Emit(new MemoryStream());

有人能指出解析的令牌和我的令牌之间的区别吗?这导致Roslyn (正确)不能将nameof表达式绑定到任何"in-code“符号,而不把它作为上下文关键字处理?

编译错误: (1,30):error CS0103:名称'nameof‘在当前上下文中不存在

Compilation#LanguageVersion: CSharp7

Roslyn版本: (Nuget最新版) Microsoft.CodeAnalysis.CSharp v2.3.2

EN

Stack Overflow用户

回答已采纳

发布于 2017-09-17 10:08:31

如果您查看Identifier的非私有成员,您将看到存在属性RawContextualKind。当您从代码中解析nameof时,您将得到以下上下文类型:

但是,如果使用SyntaxFactory.IdentifierName("nameof")创建标识符,则会得到以下内容:

在第二种情况下,nameof被视为正常标识符,这就是您接收错误的原因。您应该使用SyntaxFactory.Identifier()重载,它允许您指定上下文类型:

代码语言:javascript
运行
复制
SyntaxFactory.IdentifierName(
    SyntaxFactory.Identifier(
        SyntaxFactory.TriviaList(),
        SyntaxKind.NameOfKeyword,
        "nameof",
        "nameof",
        SyntaxFactory.TriviaList()))
票数 5
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46259039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档