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



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

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中的代码,并且那里提供了类型信息,这使我认为这是可能的。

当返回的类型是错误类型时,这是因为您的解决方案具有未解析的引用,因此找不到该类型。您需要告诉 roslyn 为解决方案包含这些引用。

这是通过创建元数据引用并将它们添加到项目中来完成的:

伪代码:

MetadataReference assemblyReference = MetadataReference.CreateFromFile(@"c:pathtosome.dll");
var solutionPath = @"c:pathtomy.sln";
var solution = workspace.OpenSolutionAsync(solutionPath).Result;
foreach (var project in solution.Projects)
{
var referencedProject = project.AddMetadataReference(assemblyReference);
var compilation = referencedProject.GetCompilationAsync().Result;
}

最新更新