[英]Roslyn get all object creations and its identifier name
我正在尋找一種解決方案,以使方法內的所有對象創建。 我想出了以下解決方案來獲取所有作品的列表:
var creations = MethodDeclaration.Body.DescendantNodes().OfType<ObjectCreationExpressionSyntax>();
但是現在我正在尋找標識符名稱(變量名稱)。 在調試時,我發現該變量具有此信息-但無法訪問identifier屬性。
creations.First().Parent.Parent.Identifier.ValueText;
因此,如果有人可以解決我的問題,我將感到非常高興。
編輯
我正在嘗試分析單元測試。 例如:
[TestMethod]
public void WarningOverReferencedTest()
{
var myVar = new MyObject();
var myVar1 = new MyObject1();
var myVar2 = new MyObject2();
var myVar3 = new MyObject();
var myVar4 = new MyObject3();
Assert.AreEqual(true, myVar.someProperty);
Assert.AreEqual(true, myVar3.someProperty2);
Assert.AreEqual(true, myVar1.someProperty);
Assert.AreEqual(true, myVar2.someProperty);
}
我想計算在Assert.AreEqual
檢查中使用的引用。 因此,上面的示例應返回3,因為myVar
和myVar3
來自同一類型,並且在Assert.AreEqual
檢查中未使用myVar4
。
您需要將creations.First().Parent.Parent
轉換為具有Identifier
屬性的Type(在您的情況下,很可能是VariableDeclaratorSyntax
,然后您就可以訪問其Identifier
。 這當然很危險,因為您可能會找到祖父母不同的ObjectCreationSyntax
。
看一下這個例子:
List<Person> people = new List<Person>() {
new Person("Jim"),
new Person("Frank")
};
您將成功獲取people
ObjectCreation
的Identifier
,但不會獲取其元素的Identifier
(因為它們根本沒有變量名)。 有很多特殊情況需要解決,有很多可能的解決方案。
一個骯臟的解決方法是檢查祖父母是否為VariableDeclarator
類型,然后才進行轉換。 也許如果您分享您想要完成的事情(按照宏偉的計划),我可以提供更好的建議。
編輯
如果我對您的理解正確,那么您想計算在方法中創建的不同類型的數量。 ObjectCreationExpressionSyntax
對象具有Type
屬性,該屬性顯示正在創建的對象的類型。 這正是您所需要的,但是獲取類型本身很麻煩 ,但是您可以像這樣查看名稱:
HashSet<ITypeSymbol> types = new HashSet<ITypeSymbol>();
foreach (ObjectCreationExpressionSyntax node in creations)
{
var typeSymbol = semanticModel.GetTypeInfo(node).Type;
types.Add(typeSymbol);
}
int numberOfTypes = types.Count;
您不能只計算node.Type
-s,因為它們是SyntaxNode
-s,並且不會完全相同。 但是它們的符號將是,並且使用HashSet
將確保您不會重復。 如果使用RegisterSemanticModelAction
則可以從上下文中獲取SemanticModel
對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.