[英]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
包含帶有MyProperty1
和MyProperty2
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.