如何使用Roslyn检查属性是否使用自定义属性进行修饰?

我想使用Roslyn分析一个C#类,并打算在被访问属性应用了特定属性时执行某些操作。 我怎样才能在CSharpSyntaxWalker.VisitPropertyDeclaration方法覆盖中执行此操作?

例如,在下面的代码块中,我想知道Date属性是否具有Validation属性,如果是,则IsJDate是true还是false?

 [Validation(IsJDate=true)] public string Date {get; set;} 

初始化:

 filesPath.ToList().ForEach(csFilePath => { SyntaxTree csSyntaxTree = CSharpSyntaxTree.ParseText(csFileSourceCode); // .... } _compiledCsCodes = CSharpCompilation.Create("CSClassesAssembly", csFiles.Select(cs => cs.CSSyntaxTree ), references); foreach (CsFile csFile in csFiles) { csFile.FileSemanticModel = _compiledCsCodes.GetSemanticModel(csFile.FullSyntaxTree); } 

最后,我通过对Yuriy的答案进行了一些修改,找到了解决方案如下:

 foreach (var attribute in node.AttributeLists.SelectMany(al => al.Attributes)) { if (csFile.FileSemanticModel.GetTypeInfo(attribute).Type.ToDisplayString() == "Proj.Attributes.ValidationAttribute") { var arg = attribute.ArgumentList.Arguments.FirstOrDefault(aa => aa.NameEquals.Name.Identifier.Text == "IsJDate"); if (arg != null && arg.Expression.IsKind(SyntaxKind.TrueLiteralExpression)) validationKind = ValidationKind.JDate; } } 

使用语义模型获取属性的绑定ISymbol ,然后调用GetAttributes()