簡體   English   中英

Roslyn:檢測IdentifierName是否為屬性?

[英]Roslyn : detect if IdentifierName is a property?

在以下示例中,使用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節點看起來相同。

謝謝。

您需要檢查從SemannticModel.GetSymbolInfo返回的SemannticModel.GetSymbolInfoIFieldSymbol還是IPropertySymbol

這是因為語法節點僅告訴您有關語法的信息。 語法樹的構造沒有引用。 它既不知道也不關心名稱是什么(甚至根本不存在)。

相反,您需要來自編譯的語義模型。

獲取IdentifierName的符號,然后檢查其KindProperty還是Field

如果符號為空,則可能存在編譯錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM