代码之家  ›  专栏  ›  技术社区  ›  Lev

Roslyn Analyzer对象初始值设定项

  •  2
  • Lev  · 技术社区  · 7 年前

    我想让分析器检测对setter属性的所有调用,这些属性不在实现特定接口的对象的对象初始值设定项内。我有点不知道如何检测,文档有点薄。我可以得到一个调用表达式,但如何检查它是否在对象初始值设定项中?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Matt Warren    7 年前

    InitializerExpressionSyntax .

    var initializer = node.Ancestors().OfType<InitializerExpressionSyntax>.FirstOrDefault();
    

    要知道任何特定代码是否是属性设置器的赋值,您需要做更多的工作。你需要询问 SemanticModel 对于分配给 AssignmentExpressionSyntax 语义模型 SyntaxTree 从其参数/上下文。

    SemanticModel model = ...;
    AssignmentExpressionSyntax assignment = ...; // find the assignment
    var symbol = model.GetSymbolInfo(assignment).Symbol as IMethodSymbol;
    if (symbol?.MethodKind == MethodKind.PropertySet) { ... }
    

    ObjectCreationExpressionSyntax 应该是 初始化表达式语法

    一旦您有了创建节点,您可以询问 语义模型 再一次使用 GetTypeInfo 方法获取表达式的类型(正在构造的类型/符号)而不是构造函数的符号。

    var creation = initializer.Ancestors().OfType<ObjectCreationSyntax>().FirstOrDefault();
    var createdType = model.GetTypeInfo(creation).Type as INamedTypeSymbol;
    

    现在,您只需要知道类型是否实现了接口。

    首先,您需要一个符号作为接口类型。一种快速的方法是使用其CLR元数据名称进行查找。

    var interfaceType = model.Compilation.GetTypeByMetadataName("MyNamspace.MyInterfaceType");
    

    现在,您已经拥有了需要发现正在构造的类型是否实现了接口的所有内容。

    if (createdType.AllInterfaces.Contains(interfaceType)) { ... }