Как получить тип переменной, объявленной в операторе using в Roslyn - PullRequest
0 голосов
/ 07 июня 2018

Я использую 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, как в примере ниже.Метод GetTypeInfo в SemaniticModel возвращает «ErrorType?».

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

Есть ли еще способ сделать это?Я проверил код в Visual Studio синтаксиса Visual Studio и там доступна информация о типах, что позволяет мне думать, что это возможно.

1 Ответ

0 голосов
/ 07 июня 2018

Когда возвращаемый тип является типом ошибки, это связано с тем, что ваше решение имеет неразрешенные ссылки, и поэтому не может найти этот тип.Вы должны указать 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;
}
...