簡體   English   中英

檢查屬性執行主體的特定方法調用

[英]Checking a property execution body for a particular method invocation

我正在為C#編譯器開發分析器。 我的任務之一是確保每個類屬性的set方法都在其執行主體中調用特定方法。

假設我有以下簡單的類:

public class SomeClass
{
    public void SetPropertyValue(int propertyValue)
    {
        // some code here
    }
}

public class MyClass : SomeClass
{
    public int MyProperty1
    {
        set => SetPropertyValue(value);
    }

    public int MyProperty2
    {
        set => AnotherMethod(value);
    }
}

假定類聲明對象以myClassTypeSymbol類型存儲在INamedTypeSymbol

我通過調用獲取所有屬性對象以進行分析:

var propertyObjects = myClassTypeSymbol.OfType<IPropertySymbol>();

現在, propertyObjects包含帶有MyProperty1MyProperty2 Enumeration

我遍歷此枚舉並為每個屬性獲取set方法。

 foreach (var onePropertyObject in propertyObjects)
 {
     IMethodSymbol setMethod = onePropertyObject.SetMethod;

     // setMethod contains "set" method of a processing property.

     // how can I test here, 
     // that setMethod contains invocation of SetPropertyValue() method?
 }

據我從文檔中了解到,無法從setMethod變量獲取方法主體。

但是,如果我們使用語法樹並處理語法樹節點,則是可能的。

使用CSharpSyntaxTree解析代碼,如下所示:

var tree = CSharpSyntaxTree.ParseText(@"
   // code to be analyzed goes here
");

然后獲取語法樹的根節點:

SyntaxNode rootNode = tree.GetRoot();

然后,您可以獲得聲明的類,方法和屬性:

var classes = rootNode.DescendantNodes().OfType<ClassDeclarationSyntax>();
var methods = rootNode.DescendantNodes().OfType<MethodDeclarationSyntax>();
var properties = rootNode.DescendantNodes().OfType<PropertyDeclarationSyntax>();

然后使用DescendantNodes()調用獲取后代語法節點,並使用GetText()獲取要分析的節點文本。

而已。

暫無
暫無

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

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