![](/img/trans.png)
[英]Roslyn get IdentifierName in ObjectCreationExpressionSyntax
[英]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.GetSymbolInfo
是IFieldSymbol還是IPropertySymbol 。
這是因為語法節點僅告訴您有關語法的信息。 語法樹的構造沒有引用。 它既不知道也不關心名稱是什么(甚至根本不存在)。
相反,您需要來自編譯的語義模型。
獲取IdentifierName
的符號,然后檢查其Kind
是Property
還是Field
。
如果符號為空,則可能存在編譯錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.