Mor*_*eza 5 c# attributes roslyn
我想使用Roslyn分析一个C#类,并打算在被访问属性应用了特定属性时执行某些操作.如何在CSharpSyntaxWalker.VisitPropertyDeclaration方法覆盖中执行此操作?
例如,在下面的代码块中,我想知道Date属性是否具有该Validation属性,如果是,IsJDate则是true还是false?
[Validation(IsJDate=true)]
public string Date {get; set;}
Run Code Online (Sandbox Code Playgroud)
初始化:
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);
}
Run Code Online (Sandbox Code Playgroud)
最后,我通过对 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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2158 次 |
| 最近记录: |