【问题标题】:How to get the type of a variable declared in a using statement in Roslyn如何获取在 Roslyn 的 using 语句中声明的变量的类型
【发布时间】:2018-06-08 01:11:30
【问题描述】:

我正在使用 Rolsyn 来尝试查找解决方案中的所有位置,在 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 Syntax Visualiser 中的代码,并且那里提供了类型信息,这让我认为这是可能的。

【问题讨论】:

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


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-30
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      相关资源
      最近更新 更多