【问题标题】:Roslyn Analyzer Check if Property Declaration is a Standard Type (int, string, Guid, etc)Roslyn Analyzer 检查属性声明是否为标准类型(int、string、Guid 等)
【发布时间】:2019-12-03 22:55:28
【问题描述】:

我正在使用 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-core roslyn roslyn-code-analysis


【解决方案1】:

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

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

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

model.GetDeclaredSymbol(propertyDeclaration).Type.ContainingAssembly

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2014-03-09
    • 2018-04-11
    • 1970-01-01
    相关资源
    最近更新 更多