首页 > 解决方案 > Roslyn Analyzer 检查属性声明是否为标准类型(int、string、Guid 等)

问题描述

我正在使用 Roslyn Analyzer 来分析代码,并且我想检查属性声明是否为标准类型(例如,字符串、int、Guid、DateTime 等)。

例如我想分析下面的代码:

namespace myApp.Models
{
    public class MyModel
    {
        public int Id { get; set; }
        public DateTime StartDate { get; set; }
        public MyOtherModel MyOtherModel { get; set; }
    }

    public class MyOtherModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

我可以使用以下方法获取所有属性声明:

var node = CSharpSyntaxTree.ParseText(aboveCodeAsString).GetRoot();
IEnumerable<ClassDeclarationSyntax> classDeclarationSyntaxes = node.DescendantNodes().OfType<ClassDeclarationSyntax>().FirstOrDefault();
var propertyDeclarations = classDeclarationSyntax.DescendantNodes().OfType<Microsoft.CodeAnalysis.CSharp.Syntax.PropertyDeclarationSyntax>();
foreach (var propertyDeclaration in propertyDeclarations)
{
    ...
}

我需要的是返回 true 的函数 IsStandardType(PropertyDeclarationSyntax propertyDeclarationSyntax):

public int myInt { get; set; }
public DateTime dateTime { get; set; }

但对于:

public MyOtherClass myOtherModel { get; set; }

在这种情况下,所有模型都将位于同一个命名空间中,因此可能的解决方案是将所有属性声明的命名空间与模型的命名空间进行比较。如果它们不相等,那么我知道它是标准类型。

但是,我也无法获取属性声明的命名空间(例如 System.DateTime 在“public DateTime dateTime { get; set; }”的情况下,所以我也需要帮助。

但是,所有模型都位于不同的文件中,因此这可能不是最佳解决方案。

标签: c#.net-coreroslynroslyn-code-analysis

解决方案


我不完全确定“标准类型”是什么意思。这是否意味着所有 BCL 类型?整箱类型?所有未在程序集中声明的类型?

无论如何,您可以通过检查 ContainingNamespace\Assembly 属性来解决它(取决于您的要求)。

例如,如果除了在您的程序集中声明的所有类型,考虑为标准类型,那么您可以编写:

model.GetDeclaredSymbol(propertyDeclaration).Type.ContainingAssembly

推荐阅读