【发布时间】: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