C# Roslyn Analyzer检查属性声明是否为标准类型(int、string、Guid等)

C# Roslyn Analyzer检查属性声明是否为标准类型(int、string、Guid等),c#,.net-core,roslyn,roslyn-code-analysis,C#,.net Core,Roslyn,Roslyn Code Analysis,我正在使用Roslyn Analyzer分析代码,我想检查属性声明是否为标准类型(例如,string、int、Guid、DateTime等) 例如,我想分析以下代码: namespace myApp.Models { public class MyModel { public int Id { get; set; } public DateTime StartDate { get; set; } public MyOtherMode

我正在使用Roslyn Analyzer分析代码,我想检查属性声明是否为标准类型(例如,string、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)
{
    ...
}
但错误的原因是:

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

但是,我在获取属性声明的名称空间时也遇到了问题(例如,在“public DateTime DateTime{get;set;}”的情况下,System.DateTime),因此我也需要这方面的帮助


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

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

无论如何,您可以通过检查ContainingNamespace\Assembly属性(取决于您的需求)来解决这个问题

例如,如果将程序集中声明的类型以外的所有类型视为标准类型,则可以编写:

model.GetDeclaredSymbol(propertyDeclaration).Type.ContainingAssembly

我认为,要以一种有意义的方式做您想要做的事情,您需要使用语义模型,而不是语法模型,这样您就可以查看类型并查看它们属于哪些程序集或名称空间。您好,斯图尔特!这对我来说很好。您能提供一个示例吗?
model.GetDeclaredSymbol(propertyDeclaration).Type.ContainingAssembly