Roslyn获取所有对象创建及其标识符名称

时间:2017-06-07 08:39:09

标签: c# roslyn

我正在寻找一种方法来获取方法中的所有对象创建。我提出了以下解决方案来获取所有创作的列表:

var creations = MethodDeclaration.Body.DescendantNodes().OfType<ObjectCreationExpressionSyntax>();

但现在我正在寻找标识符名称(变量名称)。在调试时我发现,这个变量有这个信息 - 但是标识符属性是不可访问的。

creations.First().Parent.Parent.Identifier.ValueText;

如果有人能解决我的问题,我会很高兴。

修改

我正在尝试分析单元测试。 E.g:

[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来自同一类型,并且myVar4检查中未使用Assert.AreEqual

1 个答案:

答案 0 :(得分:1)

您需要将<?php $dbconnect = new mysqli('localhost', 'root', '', 'name'); $results = array(); $secondRow = array(); foreach ($switchArray as $key => $value) { $results = snmpwalk($value, "public", ".1.3.6.1.2.1.17.4.3.1.1"); foreach ($results as $secondResults) { $secondResults = str_replace(" ", "", $secondResults); $secondResults = str_replace("Hex-STRING:", "", $secondResults); $secondResults = str_replace("STRING:", "", $secondResults); $secondResults = str_replace("INTEGER:", "", $secondResults); $secondArray[] = $secondResults; } } echo "looping through results of the ip"; echo "<pre>"; print_r($secondArray); echo "</pre>"; ?> 投射到具有creations.First().Parent.Parent属性的类型 - 在您的情况下最有可能Identifier - 然后您将能够访问其VariableDeclaratorSyntax {1}}。这当然很危险,因为您可能会发现祖父母不同的Identifier

看一下这个例子:

ObjectCreationSyntax

您将成功获得List<Person> people = new List<Person>() { new Person("Jim"), new Person("Frank") }; Identifier的{​​{1}},但不会成功获取其中的元素&#39; (因为它们根本没有变量名)。有许多角落案例需要解决,有很多可能的解决方案。

一个肮脏的解决方法是检查祖父母是否是善良的people并仅在此时施放。也许如果你分享你想要完成的事情(在宏观计划中),我可以提供更好的建议。

修改

如果我理解正确,您需要计算方法中创建的不同类型的数量。 ObjectCreation个对象具有VariableDeclarator属性,该属性显示正在创建的对象类型。这正是您所需要的,但是获取类型本身是troublesome,但您可以查看这样的名称:

ObjectCreationExpressionSyntax

您不能只计算Type - s,因为这些是HashSet<ITypeSymbol> types = new HashSet<ITypeSymbol>(); foreach (ObjectCreationExpressionSyntax node in creations) { var typeSymbol = semanticModel.GetTypeInfo(node).Type; types.Add(typeSymbol); } int numberOfTypes = types.Count; - s,并且不会相同。但他们的符号将是,并使用node.Type将确保您没有重复。如果您使用SyntaxNode,则可以从上下文中获取HashSet对象。