【问题标题】:Roslyn : detect if IdentifierName is a property?Roslyn:检测 IdentifierName 是否是属性?
【发布时间】:2018-04-11 15:21:34
【问题描述】:

通过 Roslyn,您如何知道 IdentifierName SyntaxNode 是否引用以下示例中的属性:

using System;
namespace test
{
    public class Base {
        public int Data { get {return Data;} set {Data = value;} }
        public int Normal;
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            Base b = new Base();
            int x = b.Data;
            int y = b.Normal;
        }
    }
}

当我打印 SyntaxNode 树时,最后两个赋值表达式看起来是一样的。我怎么知道 b.Data 的 IdentifierName 节点是一个属性?我检查了 ISymbol、ITypeSymbol 并没有看到这样做。

这是我打印出来的 SyntaxNode 树的一部分。

    node[4][1]=LocalDeclarationStatement,declsymbol=null,symbol=null,type=null
      node[5][0]=VariableDeclaration,declsymbol=null,symbol=null,type=null
        node[6][0]=PredefinedType,declsymbol=null,symbol=int,name=Int32,static=False,type=int,static=False,type.Kind=NamedType,type.TypeKind=Struct
        node[6][1]=VariableDeclarator,declsymbol=x,symbol=null,type=null
          node[7][0]=EqualsValueClause,declsymbol=null,symbol=null,type=null
            node[8][0]=SimpleMemberAccessExpression,declsymbol=null,symbol=test.Base.Data,name=Data,static=False,type=int,static=False,type.Kind=NamedType,type.TypeKind=Struct
              node[9][0]=IdentifierName,declsymbol=null,symbol=b,name=b,static=False,type=test.Base,static=False,type.Kind=NamedType,type.TypeKind=Class
              node[9][1]=IdentifierName,declsymbol=null,symbol=test.Base.Data,name=Data,static=False,type=int,static=False,type.Kind=NamedType,type.TypeKind=Struct
    node[4][2]=LocalDeclarationStatement,declsymbol=null,symbol=null,type=null
      node[5][0]=VariableDeclaration,declsymbol=null,symbol=null,type=null
        node[6][0]=PredefinedType,declsymbol=null,symbol=int,name=Int32,static=False,type=int,static=False,type.Kind=NamedType,type.TypeKind=Struct
        node[6][1]=VariableDeclarator,declsymbol=y,symbol=null,type=null
          node[7][0]=EqualsValueClause,declsymbol=null,symbol=null,type=null
            node[8][0]=SimpleMemberAccessExpression,declsymbol=null,symbol=test.Base.Normal,name=Normal,static=False,type=int,static=False,type.Kind=NamedType,type.TypeKind=Struct
              node[9][0]=IdentifierName,declsymbol=null,symbol=b,name=b,static=False,type=test.Base,static=False,type.Kind=NamedType,type.TypeKind=Class
              node[9][1]=IdentifierName,declsymbol=null,symbol=test.Base.Normal,name=Normal,static=False,type=int,static=False,type.Kind=NamedType,type.TypeKind=Struct

您可以看到 Data 和 Normal 的 IdentifierName 节点看起来相同。

谢谢。

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    那是因为语法节点只告诉你语法。语法树是在没有引用的情况下构建的;它既不知道也不关心名称是什么(甚至它们是否存在)。

    相反,您需要来自编译的语义模型。

    获取IdentifierName的符号,然后检查它的KindProperty还是Field

    如果符号为空,你可能有编译错误。

    【讨论】:

    • ISymbol.Kind - 为什么我没有看到。谢谢
    【解决方案2】:

    您需要检查从SemannticModel.GetSymbolInfo 返回的ISymbol 是IFieldSymbol 还是IPropertySymbol

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多