CallerMemberNameAttribute and Roslyn
本文关键字:Roslyn and CallerMemberNameAttribute | 更新日期: 2023-09-27 18:19:34
Roslyn CTP是否支持CallerMemberNameAttribute
和其他类似功能?
我有一个方法,有几个参数,有些是必需的,还有一个参数是默认值,用CallerMemberName
属性标记。
我正在由Roslyn生成此方法的调用,只传递强制性参数,并希望它也为编译器生成的参数生成值,但这并没有发生,它们有默认值。
这是Roslyn当前版本的限制,还是我做错了什么?
在微软"Roslyn"2012年9月CTP的新增功能中,注意到:
完整的C#4和Visual Basic 10语言由语法分析器,但是有一些语言特性还没有在当前的Roslyn编译器中完全实现。
调用方信息功能是在.NET Framework 4.5(C#5.0和Visual Basic 11)中引入的。因此,Roslyn在当前版本中不支持它。然而,获取调用者信息可以使用以下代码片段来完成,该代码片段来自MSDN论坛中提出的"我可以从Roslyn获取函数调用者/被调用者信息吗?"问题:
var syntaxTree = SyntaxTree.ParseCompilationUnit(code);
var semanticModel = Compilation.Create("compilation")
.AddSyntaxTrees(syntaxTree)
.AddReferences(new AssemblyFileReference(typeof(object).Assembly.Location))
.GetSemanticModel(syntaxTree);
var baz = syntaxTree.Root
.DescendentNodes()
.OfType<ClassDeclarationSyntax>()
.Single(m => m.Identifier.ValueText == "C1")
.ChildNodes()
.OfType<MethodDeclarationSyntax>()
.Single(m => m.Identifier.ValueText == "Baz");
var bazSymbol = semanticModel.GetDeclaredSymbol(baz);
var invocations = syntaxTree.Root
.DescendentNodes()
.OfType<InvocationExpressionSyntax>();
var bazInvocations = invocations
.Where(i => semanticModel.GetSemanticInfo(i).Symbol == bazSymbol);