簡體   English   中英

Roslyn獲取所有對象創建及其標識符名稱

[英]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,因為myVarmyVar3來自同一類型,並且在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 ObjectCreationIdentifier ,但不會獲取其元素的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.

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