c# – 通过SyntaxFactory构建NameOf表达式(Roslyn)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 通过SyntaxFactory构建NameOf表达式(Roslyn),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2960字,纯文字阅读大概需要5分钟。
内容图文
![c# – 通过SyntaxFactory构建NameOf表达式(Roslyn)](/upload/InfoBanner/zyjiaocheng/822/a733bb4fae2f4c9c89f158d4ee96156e.jpg)
尝试使用C#SyntaxFactory从头开始构造表达式. Roslyn无法将我的InvocationExpressionSyntax识别为关键字的上下文名称,并在Emit命令时抛出错误诊断.
试图给Roslyn有效的代码解析,希望我能找到我的语法结构和“正确解析的”之间的差异.我能够跟踪差异到“nameof”标识符令牌,但那是我被卡住的地方.我发现我的令牌和已解析的令牌之间没有任何区别,但它们仍然有些不同.
当我使用“已解析的”时,一切正常,Emit按预期工作,没有错误.另一方面,当我使用自己的令牌时,它无法编译,Emit会抛出错误诊断.
我正在测试代码:
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):错误CS0103:当前上下文中不存在名称“nameof”
编译#LanguageVersion:CSharp7
Roslyn版本:( Nuget最新)Microsoft.CodeAnalysis.CSharp v2.3.2
解决方法:
如果您查看Identifier的非私有成员,您将看到有属性RawContextualKind.当您从代码中解析nameof时,您将获得此上下文类型:
但是如果你使用SyntaxFactory.IdentifierName(“nameof”)创建标识符,你会得到:
在第二种情况下,nameof被视为普通标识符,这就是您收到错误的原因.您应该使用SyntaxFactory.Identifier()重载,它允许您指定上下文类型:
SyntaxFactory.IdentifierName(
SyntaxFactory.Identifier(
SyntaxFactory.TriviaList(),
SyntaxKind.NameOfKeyword,
"nameof",
"nameof",
SyntaxFactory.TriviaList()))
内容总结
以上是互联网集市为您收集整理的c# – 通过SyntaxFactory构建NameOf表达式(Roslyn)全部内容,希望文章能够帮你解决c# – 通过SyntaxFactory构建NameOf表达式(Roslyn)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。