c# - 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; }”的情况下,所以我也需要帮助。
但是,所有模型都位于不同的文件中,因此这可能不是最佳解决方案。
解决方案
我不完全确定“标准类型”是什么意思。这是否意味着所有 BCL 类型?整箱类型?所有未在程序集中声明的类型?
无论如何,您可以通过检查 ContainingNamespace\Assembly 属性来解决它(取决于您的要求)。
例如,如果除了在您的程序集中声明的所有类型,考虑为标准类型,那么您可以编写:
model.GetDeclaredSymbol(propertyDeclaration).Type.ContainingAssembly
推荐阅读
- python - python绘图标签的粗体文本
- java - StepExecutionListener 中的 Spring 批处理事务
- javascript - 如何在 ReactJS 中动态添加或删除表
- python - Django:不会自动选择特定用户的帖子
- vb.net - VB NET 如何将编码字符集以 vb 形式和附属成员
- javascript - 如何将 3 种颜色设置为同一个 chartjs 栏?
- ios - 将子层添加到没有情节提要的 UITextField 不会设置文本字段的样式
- python - 根据另一个列表中的值创建相应的 RGB 列表(颜色图)
- python-3.x - 当前线程 0x00002fe0(最近一次调用优先):
- docker - 挂载卷会覆盖存储在 Docker 映像中的文件