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

时间:2014-12-22 11:21:07

标签: c# attributes roslyn

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

例如,在以下代码块中,我想知道Date属性是否具有Validation属性,如果是,IsJDate是真还是假?< / p>

[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);
}

2 个答案:

答案 0 :(得分:3)

最后,我通过对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;
    }
}

答案 1 :(得分:2)

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