如何获取Roslyn中using语句中声明的变量的类型

时间:2018-06-07 08:29:24

标签: c# .net roslyn roslyn-code-analysis

我正在使用Rolsyn,尝试找到解决方案中的所有位置' Save'在ISession对象上调用方法。这是我目前的解决方案:

if (call.Expression.ToString().Contains("Save"))
{
   var innerExpression = call.Expression as MemberAccessExpressionSyntax;

      if (innerExpression != null)
      {
         if (model.GetTypeInfo(innerExpression.Expression).Type.Name.Equals("ISession"))
         {
            //Do some work.
         }
      }
}

这适用于正常情况。但是,ISession对象是在using语句中声明的,如下例所示。 SemaniticModel上的GetTypeInfo方法会带回一个' ErrorType?'。

using (var session = SessionHelper.SessionFactory.OpenSession())
{
   session.Save(entityObject);
}

有没有这样做?我已经检查了Visual Studio语法Visualiser中的代码,并且那里提供了类型信息,这让我觉得它是可能的。

1 个答案:

答案 0 :(得分:1)

当返回的类型是错误类型时,因为您的解决方案具有未解析的引用,因此无法找到该类型。您需要告诉roslyn将这些参考文献包含在解决方案中。

这是通过创建MetadataReference并将其添加到项目中来完成的:

伪代码:

MetadataReference assemblyReference = MetadataReference.CreateFromFile(@"c:\path\to\some.dll");

var solutionPath = @"c:\path\to\my.sln";
var solution = workspace.OpenSolutionAsync(solutionPath).Result;
foreach (var project in solution.Projects)
{
    var referencedProject = project.AddMetadataReference(assemblyReference);
    var compilation = referencedProject.GetCompilationAsync().Result;
}